Come rimuovere gli zeri iniziali usando C #


134

Come rimuovere gli zeri iniziali nelle stringhe usando C #?

Ad esempio, nei seguenti numeri, vorrei rimuovere tutti gli zeri iniziali.

0001234
0000001234
00001234

3
per "tipo di dati nvarchar" presumo tu intenda la stringa.
Ray

E 'C £' sta per 'C #' ...
T30,

Risposte:


151

Dipende molto da quanto tempo è NVARCHAR, poiché alcuni dei metodi sopra (specialmente quelli che convertono tramite IntXX) non funzioneranno per:

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

Qualcosa del genere sarebbe

String s ="0000058757843950000120465875468465874567456745674000004000".TrimStart(new Char[] { '0' } );
// s = "58757843950000120465875468465874567456745674000004000"

17
problematico quando strInput= "0000000";o simile. perché restituirà una stringa vuota anziché uno zero.
avrahamcool,

2
@avrahamcool che può essere gestito osservando la lunghezza della corda e semplicemente ritornando "0"se è vuoto dopo il rivestimento. O usando PadLeft(1, '0').
Cor

310

Questo è il codice che ti serve:

string strInput = "0001234";
strInput = strInput.TrimStart('0');

7
problematico quando strInput= "0000000";o simile
avrahamcool

@Emjay perché restituirà una stringa vuota anziché uno zero.
avrahamcool,

22
@avrahamcool sarebbe ancora fare esattamente quello che dovrebbe. Restituire un singolo zero sarebbe un'eccezione e dovrebbe essere gestito dallo sviluppatore.
user609926,

12
strInput.TrimStart('0').PadLeft(1, '0');gestirà "0000" > "0".
Chris Romp,

30

Codice per evitare di restituire una stringa vuota (quando l'input è come "00000").

string myStr = "00012345";
myStr = myStr.TrimStart('0');
myStr = myStr.Length > 0 ? myStr : "0";

2
supponiamo che la stringa sia molto lunga, perché tagliarla due volte? puoi salvare la stringa tagliata in una variabile
avrahamcool,

@avrahamcool, che vuoi dire, dove viene tagliato due volte? Grazie per il commento.
msysmilu,

ah, @avrahamcool, forse è per questo che l'ho modificato :) alla fine è una memoria di domande contro il tempo di calcolo; immagino che oggi la memoria non sia più un problema in questo tipo di applicazioni
msysmilu,

25

return numberString.TrimStart('0');


5
problematico quando numberString= "0000000";o simile
avrahamcool

1
@msysmilu perché restituirà una stringa vuota anziché uno zero.
avrahamcool,

1
@avrahamcool Hai ragione. Ergo, ho suggerito una risposta per evitarlo
msysmilu,

5

TryParse funziona se il tuo numero è inferiore a Int32.MaxValue . Questo ti dà anche l'opportunità di gestire stringhe formattate male. Funziona allo stesso modo per Int64.MaxValue e Int64.TryParse .

int number;
if(Int32.TryParse(nvarchar, out number))
{
   // etc...
   number.ToString();
}

Forse eccessivo per la domanda come posta, questa è la soluzione che sto cercando in quanto consente anche la rimozione di zero con spaziatura a destra per i decimali. (Decimal. TryParse)
vinto

@JK So che il post è vecchio ma mi piace molto questa soluzione in quanto è pulita e molto facile da capire. Solo una domanda che modifica il testo in un evento di pressione dei tasti genererà anche l'evento modificato dal testo: ho ragione?
Ken,

3

Questo Regex ti consente di evitare risultati errati con cifre che corrispondono solo agli zeri "0000" e funzionano su cifre di qualsiasi lunghezza:

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

E questa regex rimuoverà gli zeri iniziali ovunque all'interno della stringa:

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'uso di quanto segue restituirà un singolo 0 quando l'input è tutto 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
Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Nic3500,

Migliorata la risposta secondo il suggerimento di @ Nic3500
Bharat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.