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
Cœur
quelle
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"
Meisterschlag
quelle
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');
Craig Hannon
quelle
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";
msysmilu
quelle
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');

Strahl
quelle
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();
}
JK.
quelle
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"
dNP
quelle
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();
Deependra Mishra
quelle
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
quelle
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