Co to jest "The Best" US waluty RegEx?

głosy
44

Szybkie wyszukiwanie dla regex waluty wywołuje dużo wyników .
MSDN wykorzystuje ^ - (. \ \ D {2})? \ D + $

Mam problem w wyborze jednego z nich jest to, że regex jest trudna do zweryfikowania bez testowania wszystkich przypadków brzegowych. Mogłem spędzić wiele czasu na to, jak jestem pewien, że setki innych deweloperów już zrobione.

Więc ... Czy ktoś ma regex dla amerykańskiej waluty, który został gruntownie przetestowany ?

Moim jedynym wymaganiem jest to, że łańcuch jest dopasowany waluty amerykańskiej i przetwarza do System.Decimal :

[WS] [znak] [cyfry, cyfry] [.fractional-cyfry] [WS] 

Elementy w nawiasach kwadratowych ([i]), to opcjonalne. 
Poniższa tabela opisuje każdy element. 

Element Opis
WS opcjonalne białe znaki.
podpisać opcjonalny znak.
cyfr Sekwencja cyfry od 0 do 9.
, Kultura specyficzne tysięcy separator symbol.
, Symbol punktu dziesiętnego specyficzne kulturowo.
Cząstkowe cyfr sekwencję cyfr od 0 do 9. 
Utwórz 09/12/2008 o 21:05
źródło użytkownik
W innych językach...                            


11 odpowiedzi

głosy
72

oto kilka rzeczy z twórców Regex Buddy. Te pochodzą z biblioteki, więc jestem przekonany, że zostały dokładnie przetestowane.

Numer: kwota waluty (centy obowiązkowe) Opcjonalne separatory tysięcy; Frakcję dwucyfrowa obowiązkowe

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

Numer: kwota waluty (opcjonalne) Opcjonalne centów separatory tysięcy; Frakcję dwucyfrowa opcjonalnie

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

Ilość: ilość waluty USA i UE (centy opcjonalne) można używać amerykańskim stylu 123,456.78 notacji i europejskim stylu 123.456,78 notacji. Opcjonalne separatory tysięcy; Frakcję dwucyfrowa opcjonalnie

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{2})?|(?:,[0-9]{3})*(?:\.[0-9]{2})?|(?:\.[0-9]{3})*(?:,[0-9]{2})?)$
Odpowiedział 09/12/2008 o 21:57
źródło użytkownik

głosy
12

Uważam, że to wyrażenie regularne na linii w www.RegExLib.com Kirk Fuller, Gregg Durishan

Używam go z powodzeniem w ciągu ostatnich kilku lat.

"^\$?\-?([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}))\)$"
Odpowiedział 09/12/2008 o 22:20
źródło użytkownik

głosy
6

Nie testowane na wszystkich (ja po prostu napisał to!), Ale wydaje się zachowywać poprawnie:

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

Zestaw testowy:

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

Uwaga: Twój System.Decimal jest locale zależne, ciężko, aby w regex, z wyjątkiem być może po to buduje. Przypuszczałem cyfry są pogrupowane według trzech, nawet jeśli w niektórych kulturach (ustawień regionalnych) istnieją różne przepisy.
To jest trywialne, aby dodać spacje wokół niego.

Odpowiedział 09/12/2008 o 22:52
źródło użytkownik

głosy
0

Szukałem na to zbyt i doszli do wniosku, że najlepiej jest budować regex w oparciu o bieżący kultury. Możemy użyć

CurrencyPositivePattern 
CurrencyGroupSeparator
CurrencyDecimalSeparator

Właściwości NumberFormatInfo, aby uzyskać żądany format.

Edit: coś takiego

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 : ""); 

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

Odpowiedział 25/08/2011 o 07:57
źródło użytkownik

głosy
0

Używam następujące wyrażenie regularne dla sprawdzania poprawności waluty:

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

Można również zezwolić opcjonalnego wiodącą dolara:

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

można łatwo dodać do testowania nawiasach zamiast znaku poprzez dodanie

\( and \)
Odpowiedział 29/11/2011 o 14:15
źródło użytkownik

głosy
0

Miałem sukces to (biorąc kawałki z niektórych z powyższych regexs). Tylko uchwyty do tysięcy, ale nie powinno być zbyt trudne, że rozszerzenie

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)
}
Odpowiedział 12/12/2012 o 18:35
źródło użytkownik

głosy
0

W przypadku, gdy chcesz, aby uwzględnić błąd człowieka można zrobić walutę regex bardziej wyrozumiały podczas dopasowywania. Kiedyś 2nd ładny regex Keng i sprawiło, że nieco bardziej wytrzymałe, aby uwzględnić typo-tych.

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

To pasuje do żadnej z tych właściwych lub zniekształconych figur walutowych, ale nie odebrać dodatkową śmieci na koniec po powierzchni:

$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
Odpowiedział 05/01/2013 o 18:15
źródło użytkownik

głosy
2

Odpowiedź Keng jest idealny, po prostu chcę dodać, że do pracy z 1 lub 2 miejsc po przecinku (na trzeciej wersji):

"^[+-]?[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

Odpowiedział 15/12/2014 o 19:16
źródło użytkownik

głosy
1

To pytanie jest kilka lat, więc chciałem dać zaktualizowaną odpowiedź.

Użyłem jQuery InputMask i działa bardzo dobrze dla wejścia / formacie maskowania (takie jak numery telefonów, itp), ale to naprawdę nie działa dobrze dla waluty z mojego doświadczenia.

Dla waluty, gorąco polecam autoNumeric jQuery plugin. Jest dobrze utrzymany i oni w zasadzie „Myśl wszystkiego” I może chcieć dla waluty.

I rzeczywiście użyć kombinacji obu tych wtyczek do formatowania numerów telefonów, formatów numerycznych (ISBN, etc), a także waluty (US waluty w większości).

Należy pamiętać, że jquery.inputmaskjest przede wszystkim o kontrolę formatu wartości za, natomiast autoNumericjest o specjalnie kontrolowania formatu waluty.

Odpowiedział 12/06/2016 o 02:54
źródło użytkownik

głosy
0

To co mam użyć:

Nie prowadząc + lub -

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

Z opcjonalnym wiodącej + lub -

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

skrzypce netto: https://jsfiddle.net/compsult/9of63cwk/12/

Odpowiedział 07/07/2016 o 21:41
źródło użytkownik

głosy
0

Korzystanie odpowiedź Leandro za I dodaną ^(?:[$]|)do początku, aby umożliwić poprzedzającym znakiem dolara

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

Ten dopasowany

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

Nie znaleziono

11124.52
234223425.345
234.
.5234
a
a.23
32.a
a.a
z548,452.22
u66.36
Odpowiedział 29/06/2018 o 00:49
źródło użytkownik

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