2009-03-06 4 views
8

Was ist ein regulärer Ausdruck, der für C# geeignet ist und eine Zahl validiert, wenn sie mit den folgenden übereinstimmt?Was ist ein regulärer C# -Ausdruck, der Währung, Gleitkommazahl oder Ganzzahl validiert?

$1,000,000.150 
$10000000.199 
$10000 
1,000,000.150 
100000.123 
10000 

Oder die negativen Äquivalente?

+0

Müssen Sie RegEx verwenden? Ist die Nummer, nach der Sie suchen, in mehr Text eingebettet, oder möchten Sie nur eine Zeichenfolge parsen können, die in einem der oben genannten Formate liegt? –

+0

Seit wann hat die gültige Währung 3 Ziffern nach der Periode? – csmba

+0

@csmba Warum nicht? Die Kosten pro Kilogramm eines Produkts, das Sie in Tonnen verkaufen, können bis zu drei Dezimalstellen betragen. –

Antwort

14

Sie können csmbas Regex verwenden, wenn Sie eine geringfügige Änderung daran vornehmen.

^\$?(\d{1,3},?(\d{3},?)*\d{3}(.\d{0,3})?|\d{1,3}(.\d{2})?)$ 
+0

Prost - Csamba schien für mich zu arbeiten, gibt es einen Fehler, den dieser Mod kümmert sich? – nailitdown

+0

als Antwort markiert, weil es tatsächlich eine funktionierende Regex – nailitdown

+0

@ gwhitake Was ist mit 1235a ??? –

3
^\$?(\d{1,3},?(\d{3},?)*\d{3}(\.\d{1,3})?|\d{1,3}(\.\d{2})?)$ 
+0

oops, sprach zu bald, es scheint auf negative Zahlen zu sterben – nailitdown

0

Versuchen Sie diese. Es kann eine Feinabstimmung erforderlich sein, um nur einen Dezimalpunkt zuzulassen, aber es passt zu Ihren Testfällen. Ich hoffe das hilft.

[$\d,.]+ 
5

Ich denke, ssg ist richtig. Es ist nicht wirklich eine gute Anwendung von Regex, besonders wenn Ihre Software mit nicht-US-zentrischer Dateneingabe zu tun hat.

Zum Beispiel, wenn das Währungssymbol der Euro ist, oder der japanische Yen oder das britische Pfund eines der anderen Dutzend Währungssymbole da draußen?

Was ist mit Zahlenformatierungsregeln? In den USA würden Sie 1,000,000.00 eingeben, aber in Frankreich sollte dies 1.000.000,00 sein. Andere Länder erlauben den Abstand zwischen Zifferngruppierung ...

Wenn Sie einen geraden Regex verwenden, ohne die Kultur zu berücksichtigen, werden Sie nie erfolgreich validieren, es sei denn, Sie sind 100% sicher, dass Ihre Software niemals existiert in einem nicht-US-zentrischen Kontext verwendet.

+0

+1 gute Punkte zu berücksichtigen – nailitdown

+0

+1 dito - gute Punkte. – James

1

Seien Sie vorsichtig mit Schwimmer. Schließlich werden Sie einen Fall wie 0,01 als 0,00999999 dargestellt. Strings oder Ganzzahlen sind besser zu verwenden.

0

Mit diesem regulären Ausdruck für die US-Währung \ $ (\ d) * \ d Spiele $ 300, $ 12.900 Non-Match $ 12.900,00

2

Ich glaube, ich habe ein Problem mit ssg Lösung gefunden (oder vielleicht ein MS Fehler!).

Ausführen dieses:

float.TryParse("0,2",NumberStyles.Currency, CultureInfo.GetCultureInfo("en-US"), out num) 

Gibt true zurück. Sicher ist "0,2" kein gültiger Währungswert?

+0

das wäre .20 in Frankreich, Mexiko, Spanien oder irgendeinem anderen lateinischen abgeleiteten Land. Siehe die obigen Kommentare zu internationalen Formaten. Komisch, dass Sie bei der Spezifizierung von US immer noch wahr werden. Das wäre ein Fehler, wenn es wiederholbar ist. –

+0

Es scheint tatsächlich ein MS-Fehler zu sein. Hier sind einige der Kombinationen, die ich im Direktfenster versucht habe: float.TryParse ("0,2", NumberStyles.Currency, CultureInfo.GetCultureInfo ("en-US"), aus num) RETURN true float.TryParse ("0,2", NumberStyles.Currency, CultureInfo.GetCultureInfo ("en-AU"), aus Nummer) RETURN wahr float.TryParse ("0..2", NumberStyles.Currency, CultureInfo.GetCultureInfo ("en -AU "), out num) RETURN false float.TryParse (" 0.2 ", NumberStyles.Currency, CultureInfo.GetCultureInfo (" en-AU "), aus num) RETURN true –

+0

Niemals Float für Währung verwenden !! es kann Rundungsfehler verursachen ... – MistaGoustan