Jak usunąć wiodące zera za pomocą C #


134

Jak usunąć wiodące zera w ciągach przy użyciu C #?

Na przykład w poniższych liczbach chciałbym usunąć wszystkie wiodące zera.

0001234
0000001234
00001234

3
przez „typ danych nvarchar” Zakładam, że masz na myśli ciąg.
Ray

A „C £” oznacza „C #” ...
T30

Odpowiedzi:


151

To naprawdę zależy od tego, jak długi jest NVARCHAR, ponieważ kilka z powyższych metod (szczególnie tych, które konwertują przez IntXX) nie będą działać w przypadku:

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

Coś takiego

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

17
problematyczne strInput= "0000000";lub podobne. ponieważ zwróci pusty ciąg zamiast jednego zera.
avrahamcool

2
@avrahamcool, który można obsłużyć, patrząc na długość ciągu i po prostu zwracając, "0"jeśli jest pusty po przycięciu. Lub używając PadLeft(1, '0').
Cœur

310

Oto kod, którego potrzebujesz:

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

7
problematyczne, kiedy strInput= "0000000";lub podobne
avrahamcool,

@Emjay, ponieważ zwróci pusty ciąg zamiast jednego zera.
avrahamcool

22
@avrahamcool, nadal będzie robił dokładnie to, co powinien. Zwrócenie pojedynczego zera byłoby wyjątkiem i powinno być obsługiwane przez programistę.
user609926

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

30

Kod, aby uniknąć zwracania pustego ciągu (gdy dane wejściowe mają postać „00000”).

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

2
załóżmy, że sznurek jest bardzo długi, po co przycinać go dwukrotnie? możesz zapisać przycięty ciąg w zmiennej
avrahamcool

@avrahamcool, co masz na myśli, gdzie jest przycięte dwukrotnie? Dziękuję za komentarz.
msysmilu

ah, @avrahamcool, może dlatego to zredagowałem :) w końcu to kwestia pamięci a czas obliczeniowy; Myślę, że dzisiaj pamięć nie jest już problemem w tego typu aplikacjach
msysmilu

25

return numberString.TrimStart('0');


5
problematyczne kiedy numberString= "0000000";lub podobne
avrahamcool,

1
@msysmilu, ponieważ zwróci pusty ciąg zamiast jednego zera.
avrahamcool

1
@avrahamcool Masz rację. Ergo zasugerowałem odpowiedź, aby tego uniknąć
msysmilu

5

TryParse działa, jeśli Twój numer jest mniejszy niż Int32.MaxValue . Daje to również możliwość obsługi źle sformatowanych ciągów. Działa tak samo dla Int64.MaxValue i Int64.TryParse .

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

Być może przesada jak na zadane pytanie, jest to rozwiązanie, którego szukam, ponieważ pozwala również na usunięcie zer po przecinku z prawą dopełnieniem. (Decimal.TryParse)
winwaed

@JK Wiem, że post jest stary, ale bardzo podoba mi się to rozwiązanie, ponieważ jest przejrzyste i bardzo łatwe do zrozumienia. Tylko jedno pytanie zmieniające tekst w zdarzeniu naciśnięcia klawisza spowoduje również uruchomienie zdarzenia textchanged - czy mam rację?
Ken,

3

Ten Regex pozwala uniknąć błędnych wyników z cyframi składającymi się tylko z zer „0000” i pracować na cyfrach o dowolnej długości:

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

A to wyrażenie regularne usunie wiodące zera w dowolnym miejscu w ciągu:

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

2

Użycie poniższego polecenia zwróci pojedyncze 0, gdy wejście ma wartość 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
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Nic3500

Poprawiono odpowiedź zgodnie z sugestią @ Nic3500
Bharat,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.