Comment supprimer les zéros non significatifs en utilisant C #

134

Comment supprimer les zéros non significatifs dans les chaînes en utilisant C #?

Par exemple, dans les numéros suivants, je voudrais supprimer tous les zéros non significatifs.

0001234
0000001234
00001234
Cœur
la source
3
par 'nvarchar datatype' Je suppose que vous voulez dire string.
Ray
Et 'C £' signifie 'C #' ...
T30

Réponses:

151

Cela dépend vraiment de la durée de NVARCHAR, car certaines des méthodes ci-dessus (en particulier celles qui convertissent via IntXX) ne fonctionneront pas pendant:

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

Quelque chose comme ça

String s ="0000058757843950000120465875468465874567456745674000004000".TrimStart(new Char[] { '0' } );
// s = "58757843950000120465875468465874567456745674000004000"
Coup de maître
la source
17
problématique quand strInput= "0000000";ou similaire. car il renverra une chaîne vide au lieu d'un zéro.
avrahamcool
2
@avrahamcool qui peut être géré en regardant la longueur de la chaîne et en retournant simplement "0"si elle est vide après le découpage. Ou en utilisant PadLeft(1, '0').
Cœur
310

Voici le code dont vous avez besoin:

string strInput = "0001234";
strInput = strInput.TrimStart('0');
Craig Hannon
la source
7
problématique quand strInput= "0000000";ou similaire
avrahamcool
@Emjay car il renverra une chaîne vide au lieu d'un zéro.
avrahamcool
22
@avrahamcool, il ferait toujours exactement ce qu'il devrait. Renvoyer un seul zéro serait une exception et devrait être géré par le développeur.
user609926
12
strInput.TrimStart('0').PadLeft(1, '0');va gérer "0000" > "0".
Chris Romp
30

Code pour éviter de renvoyer une chaîne vide (lorsque l'entrée est comme "00000").

string myStr = "00012345";
myStr = myStr.TrimStart('0');
myStr = myStr.Length > 0 ? myStr : "0";
msysmilu
la source
2
Supposons que la corde soit très longue, pourquoi la couper deux fois? vous pouvez enregistrer la chaîne coupée dans une variable
avrahamcool
@avrahamcool, que voulez-vous dire, où est-il coupé deux fois? Merci pour le commentaire.
msysmilu
ah, @avrahamcool, c'est peut-être pour ça que je l'ai édité :) à la fin c'est une question mémoire vs temps de calcul; je suppose qu'aujourd'hui, la mémoire n'est plus un problème dans ce type d'applications
msysmilu
25

return numberString.TrimStart('0');

Rayon
la source
5
problématique quand numberString= "0000000";ou similaire
avrahamcool
1
@msysmilu car il renverra une chaîne vide au lieu d'un zéro.
avrahamcool
1
@avrahamcool Vous avez raison. Ergo j'ai suggéré une réponse pour éviter cela
msysmilu
5

TryParse fonctionne si votre nombre est inférieur à Int32.MaxValue . Cela vous donne également la possibilité de gérer des chaînes mal formatées. Fonctionne de la même manière pour Int64.MaxValue et Int64.TryParse .

int number;
if(Int32.TryParse(nvarchar, out number))
{
   // etc...
   number.ToString();
}
JK.
la source
Peut-être exagéré pour la question telle que posée, c'est la solution que je recherche car elle permet également de supprimer les zéros à droite pour les décimales. (Decimal.TryParse)
winwaed
@JK Je sais que le message est ancien mais j'aime vraiment cette solution car elle est propre et très facile à comprendre. Une seule question changeant le texte dans un événement de pression de touche déclenchera également l'événement de changement de texte - ai-je raison?
Ken
3

Ce Regex vous permet d'éviter les mauvais résultats avec des chiffres qui ne sont constitués que de zéros "0000" et de travailler sur des chiffres de n'importe quelle longueur:

using System.Text.RegularExpressions;

/*
00123 => 123
00000 => 0
00000a => 0a
00001a => 1a
00001a => 1a
0000132423423424565443546546356546454654633333a => 132423423424565443546546356546454654633333a
*/

Regex removeLeadingZeroesReg = new Regex(@"^0+(?=\d)");
var strs = new string[]
{
    "00123",
    "00000",
    "00000a",
    "00001a",
    "00001a",
    "0000132423423424565443546546356546454654633333a",
};
foreach (string str in strs)
{
    Debug.Print(string.Format("{0} => {1}", str, removeLeadingZeroesReg.Replace(str, "")));
}

Et cette expression régulière supprimera les zéros non significatifs n'importe où dans la chaîne:

new Regex(@"(?<!\d)0+(?=\d)");
//  "0000123432 d=0 p=002 3?0574 m=600"
//     => "123432 d=0 p=2 3?574 m=600"
dNP
la source
2

L'utilisation de ce qui suit renverra un seul 0 lorsque l'entrée est entièrement à 0.

string s = "0000000"
s = int.Parse(s).ToString();
Deependra Mishra
la source
0
Regex rx = new Regex(@"^0+(\d+)$");
rx.Replace("0001234", @"$1"); // => "1234"
rx.Replace("0001234000", @"$1"); // => "1234000"
rx.Replace("000", @"$1"); // => "0" (TrimStart will convert this to "")

// usage
var outString = rx.Replace(inputString, @"$1");
Bharat
la source
5
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
Nic3500
Amélioration de la réponse selon la suggestion de @ Nic3500
Bharat