Analysieren Sie einen integer aus einem string mit trailing garbage
Muss ich parse a decimal integer erscheint am Anfang einer Zeichenfolge.
Kann es sein, trailing garbage folgenden die dezimale Zahl. Dies muss ignoriert werden (auch wenn es enthält andere zahlen.)
z.B.
"1" => 1
" 42 " => 42
" 3 -.X.-" => 3
" 2 3 4 5" => 2
Gibt es eine integrierte Methode in der .NET framework zu tun?
int.TryParse()
ist nicht geeignet. Es können Leerzeichen, aber nicht andere nachfolgende Zeichen.
Wäre es Recht einfach zu implementieren ist, aber ich würde es vorziehen, verwenden die standard-Methode, wenn es vorhanden ist.
- Ich nehme an, Sie hassen regulären Ausdrücken, aber ich denke, das ist die Art von problem, das Sie gemeint sind zu lösen...
- Mit einem regulären Ausdruck ist in Ordnung. Aber wenn es eine built-in-Funktion, die vorzuziehen wären.
- Ist eine gültige "integer" - Zeichen folgt immer oder immer nur ein Leerzeichen vorangestellt Charakter?
- es sind nicht unbedingt alle Leerzeichen an alle. Aber die ersten nicht-Leerzeichen ist immer eine Ziffer.
- Mögliche Duplikate von " Suchen und extrahieren einer Zahl aus einer Zeichenfolge
Du musst angemeldet sein, um einen Kommentar abzugeben.
Pro aktualisiert Kommentare
Nicht sicher, warum Sie nicht wie reguläre Ausdrücke, also werde ich einfach nach, was ich denke, ist der kürzeste Lösung.
Bekommen erste int:
Können Sie Linq, um dies zu tun, keine Regulären Ausdrücke gebraucht:
Dies funktioniert für alle Ihre Beispiele:
IEnumerable<char>
.|| c == '.'
tatsächlich benötigt? Die Beispiele zeigen nicht alles, aber ganzzahlige Ergebnisse. Wenn es entfernt würde, beschleunigen Sie ein wenig, die möglicherweise von Bedeutung sein, wenn es gibt viele Extraktionen.Gibt es keinen standard .NETTO-Methode, dies zu tun - obwohl ich wäre nicht überrascht zu finden, dass die VB hatte etwas in der Microsoft.VisualBasic assembly (die ist im Lieferumfang .NET, also es ist nicht ein Problem, es zu benutzen, auch aus C#).
Wird das Ergebnis immer nicht-negativ (das würde die Dinge viel einfacher machen)?
Ehrlich gesagt, reguläre Ausdrücke sind die einfachste Möglichkeit ist hier, aber...
Dann brauchen Sie nur zu rufen
int.TryParse
auf das ErgebnisRemoveCruftFromNumber
(vergessen Sie nicht, dass die ganze Zahl ist möglicherweise zu groß, um zu speichern in einemint
).Ich wie @Donut Ansatz.
Möchte ich allerdings hinzufügen, dass
char.IsDigit
undchar.IsNumber
auch erlauben, für einige unicode-Zeichen, die Ziffern in anderen Sprachen und Schriften (siehe hier).Wenn Sie nur wollen, um zu überprüfen, für die Ziffern 0 bis 9, die Sie nutzen könnten
"0123456789".Contains(c)
.Drei Beispiel implementions:
Zu entfernen nachgestellte nicht-Ziffer-Zeichen:
Zu entfernen führende nicht-Ziffer-Zeichen:
Zu entfernen Sie alle nicht-Ziffer-Zeichen:
Und natürlich:
int.Parse(digits)
oderint.TryParse(digits, out output)
Dies ist, wie ich es getan hätte, die in Java:
Ich hatte gehofft, etwas ähnliches wäre möglich .NET.
Dies ist die regex-basierte Lösung, die ich momentan verwende:
Dies nicht wirklich Ihre Frage zu beantworten (über einen integrierten C# - Methode), aber Sie könnten versuchen, hacken off-Zeichen am Ende der input-string eins nach dem anderen, bis
int.TryParse()
akzeptiert es als gültige Zahl:Natürlich, dies wird langsam sein, wenn
input
ist sehr lang.NACHTRAG (März 2016)
Diese konnten schneller gemacht werden, indem abhacken alle nicht-Ziffern/nicht-Leerzeichen auf der rechten Seite, bevor Sie versuchen, jede parse:
Genauso gut könnte hinzufügen, auch meins.
Die message-box ist nur für Testzwecke, löschen Sie es einfach, sobald Sie überprüfen, dass die Methode funktioniert.
Ich bin mir nicht sicher, warum würden Sie vermeiden Regex in dieser situation.
Hier ein kleiner Hack, die Sie anpassen können, um Ihre Bedürfnisse.
" 3 -.X.-".ToCharArray().FindInteger().ToList().ForEach(Console.WriteLine);
BEARBEITEN:
Das ist wahr, über das falsche Ergebnis (und die Wartung dev 🙂 ).
Hier ist eine Version: