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

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"

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');

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";

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');


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();
}

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"

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();

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");

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.