2010-12-09 7 views
2

Ich habe Stunden mit diesem Problem verbracht, überall zu suchen ... Mein Problem ist einfach: Wir wollen überprüfen, ob der Benutzer eine gute Nummer eingegeben hat. Es kann eine ganze Zahl oder eine Dezimalzahl mit comas nicht Punkte und unendliche Zahlen nach Koma sein.C# Regex für eine Dezimalstelle Französisch

ich versuchte, diesen

Regex decimalRegex = new Regex(@"\d+(,\d+)?"); 

Ich dachte, es wäre in Ordnung, aber dies zum Beispiel: 2,324e ist wahr, wenn ich IsMatch auf es zu versuchen. Außerdem macht es keinen Unterschied zwischen Punkten und Komas, also ist 2.23 mit IsMatch mit meiner Regex in Ordnung.

Aber ich mag dies mit der Nummer zum Beispiel erlaubt sein 2:

2 
2,2 
2,3243241428483248 
31324,232332 (infinite numbers before and after) 

und zu verbieten:

2.2 
2,2434214e (any letter) 

und idealerweise verbieten (Ich dachte, das würde den Trick tun, aber es nicht) ...

2,2,2 or 
2.2.2 

und erlauben nur ein Koma ... ich in einem fren bin ch kultur sonst

jeder champion in regex hätte einen vorschlag? ich auch Expresso heruntergeladen die Arbeit zu tun, aber ich konnte nicht ..

+0

Warten ... Wie ist Ihr RE entspricht 2.23? Sie sagen, es findet 2.23 Sind Sie sicher, dass es 2.23 entspricht? – Keng

+0

Ich weiß, Punkt ist ok Ich weiß nicht warum, es sollte nicht, aber es passiert ... Ich weiß nicht, warum die Regex keinen Unterschied zwischen, und sehen kann. – KitAndKat

Antwort

1

Sie sind ziemlich genau auf dem richtigen Weg; Die Regex, die Sie brauchen, ist @"^(\d+(,\d*)?|,\d+)$" Die ^ und $ zwingen die Regex am Anfang und Ende der Zeichenfolge übereinstimmen, so dass nichts extra erlaubt ist. Ohne diese würde Ihre Regex 1,2 in 1,2e übereinstimmen, und denke, das war OK-das ist auch, warum 2,2,2 funktionierte, da es die erste 2,2 und den Rest ignoriert. Und das ist, warum 2.2.2 Matched-Regex die abgestimmt und ignoriert den Rest. Grundsätzlich sind Anker sehr hilfreich :-) Die andere Sache, die ich änderte, war das Hinzufügen einer ,\d+ Klausel, die Sie Nummern des Formulars ,123 übereinstimmen können. Wenn Sie das nicht wollen, nehmen Sie es heraus (@"^\d+(,\d*)?$"). Wenn Sie nicht mit 123, übereinstimmen möchten, ändern Sie die * in eine + (@"^\d+(,\d+)?$").

Wenn Sie für andere Lösungen offen sind, können Sie Ian's advice nehmen und eine vorhandene Funktion verwenden; Ich würde auch vorschlagen, die , durch [.,] zu ersetzen, so dass die Leute entweder 1,2 oder 1.2 eingeben können, da das nichts wirklich schadet, aber das Leben für einige einfacher macht. (Es sei denn, Sie sind wirklich besorgt über Tausende Separatoren, oder haben Sie einen tiefen Grund, die zweite nicht wollen.)

+0

danke, tolle Erklärung, es rockt nur und funktioniert wie ein Charme Ich möchte nicht ersetzen, mit. weil ich mit Dezimalzahlen spiele, und in der französischen Kultur braucht es ein Komma, um es zu verstehen. danke wirklich, besonders für die Anker, die ich nicht herausfinden konnte. – KitAndKat

+0

@Yaelle: Je comprends-fais ce que tu veux. :) Ich bin froh, dass das für dich funktioniert hat. –

9

Sie müssen den Ausdruck zu verankern:

Regex decimalRegex = new Regex(@"^\d+(,\d+)?$"); 

Ohne ^ am Anfang und $ am Ende wird der Ausdruck erlaubt Finde einen beliebigen Teilstring des zu testenden Strings. Die Anker verhindern, dass Teilzeichenfolgen übereinstimmen.

Mit anderen Worten, Ihr ursprünglicher Ausdruck würde mit jedem String übereinstimmen, der mindestens eine Ziffer enthält.

+0

danke, das ist genau das, was ich brauchte, dachte nicht über Anker – KitAndKat

5

Warum nicht nach der Einstellung der richtigen Kultur Int32.TryParse() oder Double.TryParse() verwenden? In deiner Frage hast du ein Int oder ein Double gesagt, aber dann eine 'unendliche Zahl nach dem Komma' gesagt. Diese sind abhängig von ihren Reichweiten möglicherweise keine Ints oder Doubles. TryParse wird die Reichweitenüberprüfung auch für Sie durchführen ...