Nicht numerische Zeichen in der Zeichenfolge entfernen

114

Hey, ich möchte nicht numerische Zeichen in einer Zeichenfolge in ASP.NET C # entfernen

Also dh 40.595 pa

würde mit 40595 enden

Vielen Dank

StevieB
quelle
3
Hier ist Ihre Antwort: stackoverflow.com/questions/262448/…

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());
}
Fredrik Mörk
quelle
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].

Jonas Elfström
quelle
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());
    }
Ercan Ayan
quelle
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

Onkelborg
quelle
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());
}
Kernowcode
quelle
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.

Tim
quelle
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()); 
dhirschl
quelle
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.

Darkseal
quelle
0
public static string RemoveNonNumeric(string value) => Regex.Replace(value, "[^0-9]", "");
Patrick Cairns
quelle
-1
 var output = new string(input.Where(char.IsNumber).ToArray());
Emre Sevim
quelle