So entfernen Sie führende Nullen mit C #


133

Wie entferne ich führende Nullen in Strings mit C #?

Zum Beispiel möchte ich in den folgenden Zahlen alle führenden Nullen entfernen.

0001234
0000001234
00001234

3
Mit 'nvarchar datatype' meine ich Zeichenfolge.
Ray

Und 'C £' steht für 'C #' ...
T30

Antworten:


150

Es hängt wirklich davon ab, wie lange NVARCHAR dauert, da einige der oben genannten Methoden (insbesondere diejenigen, die über IntXX konvertieren) nicht funktionieren:

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

So etwas würde

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

17
problematisch wenn strInput= "0000000";oder ähnlich. weil es eine leere Zeichenfolge anstelle einer Null zurückgibt.
Avrahamcool

2
@avrahamcool, das behandelt werden kann, indem man sich die Länge der Zeichenfolge ansieht und einfach zurückgibt, "0"wenn sie nach dem Trimmen leer ist. Oder mit PadLeft(1, '0').
Cœur

309

Dies ist der Code, den Sie benötigen:

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

7
problematisch wenn strInput= "0000000";oder ähnlich
avrahamcool

@Emjay, weil es eine leere Zeichenfolge anstelle einer Null zurückgibt.
Avrahamcool

22
@avrahamcool es würde immer noch genau das tun, was es sollte. Die Rückgabe einer einzelnen Null wäre eine Ausnahme und sollte vom Entwickler behandelt werden.
user609926

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

30

Code, um die Rückgabe einer leeren Zeichenfolge zu vermeiden (wenn die Eingabe "00000" entspricht).

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

2
Nehmen wir an, die Saite ist sehr lang. Warum zweimal schneiden? Sie können die zugeschnittene Zeichenfolge in einer Variablen
speichern

@avrahamcool, was meinst du, wo wird es zweimal getrimmt? Danke für den Kommentar.
Msysmilu

ah, @avrahamcool, vielleicht habe ich es deshalb bearbeitet :) am Ende ist es ein Fragenspeicher gegen Rechenzeit; Ich denke, heute ist Speicher kein Problem mehr in solchen Anwendungen
msysmilu

25

return numberString.TrimStart('0');


5
problematisch wenn numberString= "0000000";oder ähnlich
avrahamcool

1
@msysmilu, da anstelle einer Null eine leere Zeichenfolge zurückgegeben wird.
Avrahamcool

1
@avrahamcool Du hast recht. Ergo schlug ich eine Antwort vor, um dies zu vermeiden
msysmilu

5

TryParse funktioniert, wenn Ihre Nummer kleiner als Int32.MaxValue ist . Dies gibt Ihnen auch die Möglichkeit, schlecht formatierte Zeichenfolgen zu verarbeiten. Funktioniert genauso für Int64.MaxValue und Int64.TryParse .

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

Vielleicht übertrieben für die gestellte Frage, dies ist die Lösung, nach der ich suche, da sie auch das Entfernen von rechts aufgefüllten Nullen für Dezimalstellen ermöglicht. (Decimal.TryParse)
Winwaed

@JK Ich weiß, dass der Beitrag alt ist, aber ich mag diese Lösung wirklich, da sie sauber und sehr leicht zu verstehen ist. Nur eine Frage zum Ändern des Textes in einem Tastendruckereignis löst auch das textveränderte Ereignis aus - bin ich richtig?
Ken

3

Mit diesem Regex können Sie falsche Ergebnisse mit Ziffern vermeiden, die nur aus Nullen "0000" bestehen, und Ziffern beliebiger Länge bearbeiten:

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

Und dieser reguläre Ausdruck entfernt führende Nullen an einer beliebigen Stelle innerhalb der Zeichenfolge:

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

2

Wenn Sie Folgendes verwenden, wird eine einzelne 0 zurückgegeben, wenn die Eingabe alle 0 ist.

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
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Nic3500

Die Antwort wurde gemäß dem Vorschlag von @ Nic3500 verbessert
Bharat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.