Nicht numerische Zeichen in der Zeichenfolge entfernen


Antworten:


234

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());
}

21
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].


1
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:

public static string GetNumbers(this string text)
    {
        text = text ?? string.Empty;
        return new string(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 = 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


4

Andere Option ...

private static string RemoveNonNumberDigitsAndCharacters(string text)
{
    var numericChars = "0123456789,.".ToCharArray();
    return new String(text.Where(c => numericChars.Any(n => n == c)).ToArray());
}

2
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.


0

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()); 

Was muss ich tun, damit Regex funktioniert
— ?

using System.Text.RegularExpressions;
— Dhirschl

0

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.


0
public static string RemoveNonNumeric(string value) => Regex.Replace(value, "[^0-9]", "");

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.