Sie sollten wahrscheinlich IsDigiteher Folgendes verwenden als IsNumber: "Diese Methode [ IsNumber] bestimmt, ob a Charzu einer numerischen Unicode-Kategorie gehört. Zusätzlich zu Ziffern enthalten Zahlen Zeichen, Brüche, Indizes, hochgestellte Zeichen, römische Ziffern, Währungszähler und eingekreiste Zahlen. Diese Methode kontrastiert mit der IsDigitMethode, die bestimmt, ob a Chareine Radix-10-Ziffer ist. " msdn.microsoft.com/en-us/library/yk2b3t2y.aspx
LukeH
2
@ TrevorBrooks Angenommen, Sie können nur die Begriffe erweitern:input.Where(c => char.IsDigit(c) || char.IsWhiteSpace(c))
Fredrik Mörk
6
Man kann es weiter vereinfachen return new string(input.Where(char.IsDigit).ToArray());. Ich mache es nur lesbarer
Zapnologica
2
Gute Antwort. Vielleicht möchten Sie auch die Funktion von 'GetNumbers' in 'GetDigits' umbenennen, um ihre Absicht klar zu machen.
JTech
2
Macht auch eine großartige Erweiterungsmethode.
Roberto Bonini
61
Fühlt sich gut für einen regulären Ausdruck an.
var s ="40,595 p.a.";var stripped =Regex.Replace(s,"[^0-9]","");
"[^0-9]"kann durch ersetzt werden, @"\D"aber ich mag die Lesbarkeit von [^0-9].
Ich würde zustimmen, solange Sie mit dem Overhead einverstanden sind, der mit regulären Ausdrücken in .Net
FrankO
4
Was ist aus Neugier der Leistungsaufwand zwischen dieser Antwort und der Antwort von Fredrik Mork?
Scuba Steve
Dies ist wahrscheinlich langsamer, aber der einzige Weg, dies zu wissen, ist das Messen, da es davon abhängt, wie .NET reguläre Ausdrücke implementiert, wie der Lambda-Ausdruck kompiliert wird und vieles mehr.
Jonas Elfström
1
Dies ist flexibler als die Verwendung von IsDigit (), da Sie '.' Hinzufügen können. Zeichen in den regulären Ausdruck, wenn Sie Zahlen mit Dezimalstellen zulassen möchten.
Richard Moore
9
Ich habe einen einfachen Vergleich von Regex mit LINQ an einer Zeichenfolge durchgeführt, die aus 100.000 zusammengefügten GUIDs besteht (was zu einer Zeichenfolge mit 3.600.000 Zeichen führt). Regex lag konstant bei etwa einer halben Sekunde, während LINQ konstant im Bereich von 1/10 Sekunde lag. Grundsätzlich war LINQ im Durchschnitt fünfmal oder öfter schneller.
Chris Pratt
8
Eine Erweiterungsmethode ist ein besserer Ansatz:
publicstaticstringGetNumbers(thisstring text){
text = text ??string.Empty;returnnewstring(text.Where(p =>char.IsDigit(p)).ToArray());}
Ich ziehe es if (text == null) return string.Empty;vor text = text ?? string.Empty;. Auf diese Weise verringern wir nicht die Leistung.
Hooman
5
Verwenden Sie entweder einen regulären Ausdruck, der nur 0-9 erfasst und den Rest wegwirft. Ein regulärer Ausdruck ist eine Operation, die beim ersten Mal viel kostet. Oder machen Sie so etwas:
var sb =newStringBuilder();var goodChars ="0123456789".ToCharArray();var input ="40,595";foreach(var c in input){if(goodChars.IndexOf(c)>=0)
sb.Append(c);}var output = sb.ToString();
So etwas denke ich, ich habe es aber nicht zusammengestellt.
was ist mit negativ? (-) sollte nicht minus davon getrennt sein?
Seabizkit
0
Nun, Sie wissen, was die Ziffern sind: 0123456789, richtig? Durchlaufen Sie Ihre Zeichenfolge zeichenweise. Wenn das Zeichen eine Ziffer ist, heften Sie es an das Ende einer temporären Zeichenfolge, andernfalls ignorieren Sie es. Möglicherweise sind andere Hilfsmethoden für C # -Strings verfügbar, dies ist jedoch ein allgemeiner Ansatz, der überall funktioniert.
Die akzeptierte Antwort ist großartig, berücksichtigt jedoch keine NULL-Werte und ist daher in den meisten Szenarien unbrauchbar.
Dies brachte mich dazu, stattdessen diese Hilfsmethoden zu verwenden. Der erste beantwortet das OP, während die anderen für diejenigen nützlich sein können, die das Gegenteil tun möchten:
/// <summary>/// Strips out non-numeric characters in string, returning only digits/// ref.: /programming/3977497/stripping-out-non-numeric-characters-in-string/// </summary>/// <param name="input">the input string</param>/// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>/// <returns>the input string numeric part: for example, if input is "XYZ1234A5U6" it will return "123456"</returns>publicstaticstringGetNumbers(string input,bool throwExceptionIfNull =false){return(input ==null&&!throwExceptionIfNull)? input
:newstring(input.Where(c =>char.IsDigit(c)).ToArray());}/// <summary>/// Strips out numeric and special characters in string, returning only letters/// </summary>/// <param name="input">the input string</param>/// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>/// <returns>the letters contained within the input string: for example, if input is "XYZ1234A5U6~()" it will return "XYZAU"</returns>publicstaticstringGetLetters(string input,bool throwExceptionIfNull =false){return(input ==null&&!throwExceptionIfNull)? input
:newstring(input.Where(c =>char.IsLetter(c)).ToArray());}/// <summary>/// Strips out any non-numeric/non-digit character in string, returning only letters and numbers/// </summary>/// <param name="input">the input string</param>/// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>/// <returns>the letters contained within the input string: for example, if input is "XYZ1234A5U6~()" it will return "XYZ1234A5U6"</returns>publicstaticstringGetLettersAndNumbers(string input,bool throwExceptionIfNull =false){return(input ==null&&!throwExceptionIfNull)? input
:newstring(input.Where(c =>char.IsLetterOrDigit(c)).ToArray());}
Antworten:
Es gibt viele Möglichkeiten, aber dies sollte funktionieren (ich weiß nicht, wie es mit wirklich großen Saiten funktioniert):
quelle
IsDigit
eher Folgendes verwenden alsIsNumber
: "Diese Methode [IsNumber
] bestimmt, ob aChar
zu einer numerischen Unicode-Kategorie gehört. Zusätzlich zu Ziffern enthalten Zahlen Zeichen, Brüche, Indizes, hochgestellte Zeichen, römische Ziffern, Währungszähler und eingekreiste Zahlen. Diese Methode kontrastiert mit derIsDigit
Methode, die bestimmt, ob aChar
eine Radix-10-Ziffer ist. " msdn.microsoft.com/en-us/library/yk2b3t2y.aspxinput.Where(c => char.IsDigit(c) || char.IsWhiteSpace(c))
return new string(input.Where(char.IsDigit).ToArray());
. Ich mache es nur lesbarerFühlt sich gut für einen regulären Ausdruck an.
"[^0-9]"
kann durch ersetzt werden,@"\D"
aber ich mag die Lesbarkeit von[^0-9]
.quelle
Eine Erweiterungsmethode ist ein besserer Ansatz:
quelle
if (text == null) return string.Empty;
vortext = text ?? string.Empty;
. Auf diese Weise verringern wir nicht die Leistung.Verwenden Sie entweder einen regulären Ausdruck, der nur 0-9 erfasst und den Rest wegwirft. Ein regulärer Ausdruck ist eine Operation, die beim ersten Mal viel kostet. Oder machen Sie so etwas:
So etwas denke ich, ich habe es aber nicht zusammengestellt.
LINQ ist, wie Fredrik sagte, auch eine Option
quelle
Andere Option ...
quelle
Nun, Sie wissen, was die Ziffern sind: 0123456789, richtig? Durchlaufen Sie Ihre Zeichenfolge zeichenweise. Wenn das Zeichen eine Ziffer ist, heften Sie es an das Ende einer temporären Zeichenfolge, andernfalls ignorieren Sie es. Möglicherweise sind andere Hilfsmethoden für C # -Strings verfügbar, dies ist jedoch ein allgemeiner Ansatz, der überall funktioniert.
quelle
Hier ist der Code mit regulären Ausdrücken:
quelle
Die akzeptierte Antwort ist großartig, berücksichtigt jedoch keine NULL-Werte und ist daher in den meisten Szenarien unbrauchbar.
Dies brachte mich dazu, stattdessen diese Hilfsmethoden zu verwenden. Der erste beantwortet das OP, während die anderen für diejenigen nützlich sein können, die das Gegenteil tun möchten:
Für weitere Informationen lesen Sie diesen Beitrag in meinem Blog.
quelle
quelle
quelle