Antworten:
Es gibt viele Möglichkeiten, aber dies sollte funktionieren (ich weiß nicht, wie es mit wirklich großen Saiten funktioniert):
private static string GetNumbers(string input)
{
return new string(input.Where(c => char.IsDigit(c)).ToArray());
}
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
input.Where(c => char.IsDigit(c) || char.IsWhiteSpace(c))
return new string(input.Where(char.IsDigit).ToArray());. Ich mache es nur lesbarer
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].
Eine Erweiterungsmethode ist ein besserer Ansatz:
public static string GetNumbers(this string text)
{
text = text ?? string.Empty;
return new string(text.Where(p => char.IsDigit(p)).ToArray());
}
if (text == null) return string.Empty;vor text = 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:
var sb = new StringBuilder();
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.
LINQ ist, wie Fredrik sagte, auch eine Option
Andere Option ...
private static string RemoveNonNumberDigitsAndCharacters(string text)
{
var numericChars = "0123456789,.".ToCharArray();
return new String(text.Where(c => numericChars.Any(n => n == c)).ToArray());
}
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.
Hier ist der Code mit regulären Ausdrücken:
string str = "40,595 p.a.";
StringBuilder convert = new StringBuilder();
string pattern = @"\d+";
Regex regex = new Regex(pattern);
MatchCollection matches = regex.Matches(str);
foreach (Match match in matches)
{
convert.Append(match.Groups[0].ToString());
}
int value = Convert.ToInt32(convert.ToString());
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>
public static string GetNumbers(string input, bool throwExceptionIfNull = false)
{
return (input == null && !throwExceptionIfNull)
? input
: new string(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>
public static string GetLetters(string input, bool throwExceptionIfNull = false)
{
return (input == null && !throwExceptionIfNull)
? input
: new string(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>
public static string GetLettersAndNumbers(string input, bool throwExceptionIfNull = false)
{
return (input == null && !throwExceptionIfNull)
? input
: new string(input.Where(c => char.IsLetterOrDigit(c)).ToArray());
}
Für weitere Informationen lesen Sie diesen Beitrag in meinem Blog.
public static string RemoveNonNumeric(string value) => Regex.Replace(value, "[^0-9]", "");
var output = new string(input.Where(char.IsNumber).ToArray());