Was ist "The Best" US-Währung RegEx?

stimmen
44

Eine schnelle Suche nach Währung regex bringt eine Menge von Ergebnissen .
MSDN verwendet ^ - (. \ \ D {2})? \ D + $

Das Problem, das ich bei der Auswahl einer von ihnen ist, dass regex schwierig ist, ohne Prüfung alle Grenzfälle zu überprüfen. Ich konnte viel Zeit dafür aufwenden, wie ich bin sicher, dass Hunderte von anderen Entwicklern bereits getan haben.

Also ... Hat jemand einen regulären Ausdruck für die US - Währung , die wurde gründlich getestet ?

Meine einzige Voraussetzung ist , dass die angepasste Schnur US - Währung und parst zu System.Decimal :

[Ws] [sign] [digits,] Ziffern [.fractional-Ziffern] [ws] 

Elemente in eckigen Klammern ([und]) sind optional. 
Die folgende Tabelle beschreibt die einzelnen Elemente. 

ELEMENT BESCHREIBUNG
ws Optional weißer Raum.
Ein optionales Zeichen unterzeichnen.
Eine Folge von Ziffern Ziffern von 0 bis 9 reicht.
, A kulturspezifischen Tausendertrennzeichen-Symbol.
. Ein kulturspezifischen Dezimalpunkt Symbol.
Eine Folge von Ziffern Fractional-Ziffern im Bereich von 0 bis 9 ist. 
Veröffentlicht am 09/12/2008 um 21:05
quelle vom benutzer
In anderen Sprachen...                            


11 antworten

stimmen
72

hier einige Sachen von den Machern von Regex Buddy. Diese kamen aus der Bibliothek so bin ich überzeugt, dass sie wurden ausgiebig getestet.

Nummer: Währungsbetrag (cents Pflicht) Wahl Tausendertrennzeichen; obligatorische zweistellige Fraktion

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:,?[0-9]{3})*\.[0-9]{2}$

Nummer: Währungsbetrag (cents optional) Optional Tausendertrennzeichen; optional zweistelliger Bruch

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{2})?$

Anzahl: Währung Betrag USA und EU (Cent optional) verwenden können, um im US-Stil 123,456.78 Notation und im europäischen Stil 123.456,78 Notation. Optional Tausendertrennzeichen; optional zweistelliger Bruch

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{2})?|(?:,[0-9]{3})*(?:\.[0-9]{2})?|(?:\.[0-9]{3})*(?:,[0-9]{2})?)$
Beantwortet am 09/12/2008 um 21:57
quelle vom benutzer

stimmen
12

Ich fand diesen regulären Ausdruck auf Linie an www.RegExLib.com von Kirk Fuller, Gregg Durishan

Ich habe es erfolgreich für die letzten paar Jahre.

"^\$?\-?([1-9]{1}[0-9]{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))$|^\-?\$?([1-9]{1}\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))$|^\(\$?([1-9]{1}\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))\)$"
Beantwortet am 09/12/2008 um 22:20
quelle vom benutzer

stimmen
6

Nicht gründlich überhaupt getestet (ich schrieb es nur!), Aber richtig zu verhalten scheint:

^-?(?:0|[1-9]\d{0,2}(?:,?\d{3})*)(?:\.\d+)?$

Test-Set:

0
1
33
555
4,656
4656
99,785
125,944
7,994,169
7994169
0.00
1.0
33.78795
555.12
4,656.489
99,785.01
125,944.100
-7,994,169
-7994169.23 // Borderline...

Wrong:
000
01
3,3
5.
555,
,656
99,78,5
1,25,944
--7,994,169
0.0,0
.10
33.787,95
4.656.489
99.785,01
1-125,944.1
-7,994E169

Hinweis: Ihr System.Decimal ist locale abhängig, hart in regex zu machen, außer vielleicht , wenn es zu bauen. Ich nahm Ziffern von drei gruppiert werden, auch wenn in einigen Kulturen ( Positionen ) gibt es unterschiedliche Regeln.
Es ist trivial Leerzeichen hinzuzufügen , um ihn herum.

Beantwortet am 09/12/2008 um 22:52
quelle vom benutzer

stimmen
2

Die Antwort von Keng ist perfekt, ich nur noch hinzufügen will mit 1 oder 2 Dezimalstellen (für dritte Version) arbeiten:

"^[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{1})?|(?:,[0-9]{3})*(?:\.[0-9]{1,2})?|(?:\.[0-9]{3})*(?:,[0-9]{1,2})?)$

NET FIDDLE: https://dotnetfiddle.net/1mUpX2

Beantwortet am 15/12/2014 um 19:16
quelle vom benutzer

stimmen
1

Diese Frage ist ein paar Jahre alt, also wollte ich eine aktualisierte Antwort geben.

Ich habe verwendet jQuery InputMask und es funktioniert sehr gut für die Eingabe / Format (wie zB Telefonnummern, etc.) maskiert , aber es nicht wirklich gut aus meiner Erfahrung für Währung nicht funktioniert.

Für die Währungs, empfehle ich dringend autoNumeric jQuery - Plugin. Es ist gut gepflegt und sie haben im Grunde „an alles gedacht : “ Ich für Währung wünschen könnte.

Ich eigentlich eine Kombination aus diesen beiden Plugins für die Formatierung von Telefonnummern, Zahlenformaten (ISBN usw.) sowie Währungen (US-Währung meistens).

Beachten Sie, dass jquery.inputmaskvor allem darum , einen Wert des Format steuern, während autoNumericetwa speziell das Format der Währung zu steuern.

Beantwortet am 12/06/2016 um 02:54
quelle vom benutzer

stimmen
0

Mit Leandro Antwort Ich habe ^(?:[$]|)zu Beginn für einen vorangehenden Dollarzeichen zu ermöglichen ,

^(?:[$]|)[ -]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{1})?|(?:,[0-9]{3})*(?:\.[0-9]{1,2})?|(?:\.[0-9]{3})*(?:,[0-9]{1,2})?)$

Dieses abgestimmt

136,402.99
25.27
0.33
$584.56
1
00.2
3,254,546.00
$3,254,546.00
00.01
-0.25
 0.85
 100,052.00

Hat nicht gepasst

11124.52
234223425.345
234.
.5234
a
a.23
32.a
a.a
z548,452.22
u66.36
Beantwortet am 29/06/2018 um 00:49
quelle vom benutzer

stimmen
0

Dies ist, was ich benutze:

Ohne führende + oder -

^\$\d{1,3}\.[0-9]{2}$|^\$(\d{1,3},)+\d{3}\.[0-9]{2}$

Mit optionalen führenden + oder -

^[+-]?\$\d{1,3}\.[0-9]{2}$|^[+-]?\$(\d{1,3},)+\d{3}\.[0-9]{2}$

net Geige: https://jsfiddle.net/compsult/9of63cwk/12/

Beantwortet am 07/07/2016 um 21:41
quelle vom benutzer

stimmen
0

Falls Sie für menschliche Fehler erklären Sie die Regex nachsichtiger, wenn passende Währung machen könnte. Ich benutzen Keng 2nd schöne regex und machte es ein bisschen robuste für Tippfehler zu berücksichtigen.

\$\ ?[+-]?[0-9]{1,3}(?:,?[0-9])*(?:\.[0-9]{1,2})?

Dies wird jeden dieser richtigen oder verstümmelten Währung Zahlen entspricht aber nicht den zusätzlichen Müll am Ende nach dem Raum holen:

$46,48382
$4,648,382
$ 4,648,382
$4,648,382.20
$4,648,382.2
$4,6483,82.20
$46,48382 70.25PD
$ 46,48382 70.25PD
Beantwortet am 05/01/2013 um 18:15
quelle vom benutzer

stimmen
0

Ich habe Erfolg mit diesem hat (Bits und Stücke von einigen der regexs oben nehmen). Nur Griffe bis zu Tausenden, aber sollte nicht zu schwer sein, zu verlängern, dass

case class CurrencyValue(dollars:Int,cents:Int)
def cents = """[\.\,]""".r ~> """\d{0,2}""".r ^^ {
  _.toInt
}
def dollarAmount: Parser[Int] = """[1-9]{1}[0-9]{0,2}""".r ~ opt( """[\.\,]""".r ~> """\d{3}""".r) ^^ {
  case x ~ Some(y) => x.toInt * 1000 + y.toInt
  case x ~ None => x.toInt
}
def usCurrencyParser = """(\$\s*)?""".r ~> dollarAmount ~ opt(cents) <~ opt( """(?i)dollars?""".r) ^^ {
  case d ~ Some(change) => CurrencyValue(d, change)
  case d ~ None => CurrencyValue(d, 0)
}
Beantwortet am 12/12/2012 um 18:35
quelle vom benutzer

stimmen
0

Ich verwende den folgenden regulären Ausdruck für die Währungs Validierung:

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

Sie können auch optional führende Dollarzeichen erlauben:

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

Sie können ganz einfach Tests hinzufügen, anstatt Zeichen für Klammern durch Hinzufügen

\( and \)
Beantwortet am 29/11/2011 um 14:15
quelle vom benutzer

stimmen
0

Ich war zu sehr auf dieser Suche und bin zu dem Schluss gekommen, dass es am besten ist, die Regex zu bauen, basierend auf der aktuellen Kultur. Wir können die Verwendung

CurrencyPositivePattern 
CurrencyGroupSeparator
CurrencyDecimalSeparator

Eigenschaften NumberFormatInfodas gewünschte Format zu bekommen.

Edit: so etwas wie diese

NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
      // Assign needed property values to variables.
      string currencySymbol = nfi.CurrencySymbol;
      bool symbolPrecedesIfPositive = nfi.CurrencyPositivePattern % 2 == 0;
      string groupSeparator = nfi.CurrencyGroupSeparator;
      string decimalSeparator = nfi.CurrencyDecimalSeparator;

      // Form regular expression pattern.
      string pattern = Regex.Escape( symbolPrecedesIfPositive ? currencySymbol : "") + 
                       @"\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" + 
                       Regex.Escape(decimalSeparator) + "[0-9]+)?)" + 
                       (! symbolPrecedesIfPositive ? currencySymbol : ""); 

beziehen - http://msdn.microsoft.com/en-us/library/hs600312.aspx

Beantwortet am 25/08/2011 um 07:57
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more