"En iyi" ABD Para RegEx nedir?

oy
44

Para regex için hızlı arama getirir sonuçlarının çok .
MSDN kullanır ? (. \ \ D {2})? \ D + $ - ^

Bunlardan birini seçerek sahip sorun regex tüm sınır durumları test etmeden doğrulamak için zor olmasıdır. Ben diğer geliştiricilerin emin yüzlerce zaten yapmış olduğum gibi bu konuda çok fazla zaman harcayabilirsiniz.

Yani ... kimse edilmiş ABD Para için bir regex var mı iyice test ?

Benim tek şartı eşleşti dize Döviz ABD ve olmasıdır System.Decimal için ayrıştırır :

[Ws] [işaret] [basamak] basamak [.fractional-basamaklı] [si] 

köşeli parantez içinde elemanları ([ve]) isteğe bağlıdır. 
Aşağıdaki tablo, her öğe açıklanmaktadır. 

ELEMANI TARİFİ
ws İsteğe bağlı beyaz boşluk.
İsteğe bağlı sign.
0 ile 9 arasında değişen rakamlardan parmaklara.
A kültüre özgü binlerce ayırıcı sembolü.
. Bir kültür özgü ondalık simgesi.
Kesirli-basamaklı 0 ile 9 arasında değişen basamak dizisi. 
Oluştur 09/12/2008 saat 21:05
kaynak kullanıcı
Diğer dillerde...                            


11 cevaplar

oy
72

Burada Regex Buddy yapımcıları bazı şeyler. onlar iyice test edilmiş eminim bu yüzden bu kütüphaneden geldi.

Numara: Para miktarı (zorunlu sent) Opsiyonel binlerce ayırıcılar; zorunlu iki basamaklı fraksiyonu

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

Numara: Para miktarı (opsiyonel sent) İsteğe binlerce ayırıcılar; İsteğe bağlı iki basamaklı fraksiyonu

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

Numara: para tutarı ABD & AB (opsiyonel sent) ABD tarzı 123,456.78 notasyonu ve Avrupa tarzı 123.456,78 notasyonu kullanabilir. Opsiyonel binlerce ayırıcılar; İsteğe bağlı iki basamaklı fraksiyonu

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{2})?|(?:,[0-9]{3})*(?:\.[0-9]{2})?|(?:\.[0-9]{3})*(?:,[0-9]{2})?)$
Cevap 09/12/2008 saat 21:57
kaynak kullanıcı

oy
12

Kirk Fuller, Gregg Durishan tarafından www.RegExLib.com de on line bu normal ifade buldu

Ben son birkaç yıl için başarılı bir şekilde kullanıyorum.

"^\$?\-?([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}))\)$"
Cevap 09/12/2008 saat 22:20
kaynak kullanıcı

oy
6

İyice tüm test edilmedi (! Ben sadece yazdım), ancak doğru davranmaya görünüyor:

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

Deneme seti:

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

Not: Sizin System.Decimal bu bina belki dışında, regex yapmak zor, bağımlı yerel bir. Ben rakam bazı kültürlerde (yerel ayarlar) farklı kurallar vardır bile üçe gruplandırılmak üstlendi.
O çevresinde boşluk eklemek için Önemsiz.

Cevap 09/12/2008 saat 22:52
kaynak kullanıcı

oy
2

Keng cevabı sadece (üçüncü versiyonu için) 1 veya 2 ondalık ile çalışmak için eklemek istediğiniz, mükemmel:

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

Cevap 15/12/2014 saat 19:16
kaynak kullanıcı

oy
1

Bu soru birkaç yıl eski, bu yüzden güncellenmiş bir cevap vermek istedik.

Ben kullandım jQuery ınputmask ve ama gerçekten benim deneyimlerinden para birimi için de işe DEĞİLDİR (telefon numaraları, vs gibi) maskeleme giriş / biçim için çok iyi çalışıyor.

Para için şiddetle tavsiye autoNumeric jQuery eklentisi. Bu bakımlı ve Bunlar, temelde "Her şeyin düşünce" Ben para için tercih edebilir ettik.

Aslında telefon numaraları, sayı biçimlerini (ISBN, vs) yanı sıra para (çoğunlukla ABD para birimi) biçimlendirmek için bu eklentileri her ikisinin bir kombinasyonunu kullanır.

Unutmayın jquery.inputmaskoysa, çoğunlukla değerin formatını kontrol etmeyle ilgili olduğu autoNumerichakkında özellikle para biçimini kontrol ediyor.

Cevap 12/06/2016 saat 02:54
kaynak kullanıcı

oy
0

Eklediğim Leandro cevabını kullanma ^(?:[$]|)bir önceki dolar işareti sağlamak için başlangıcına

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

Bu eşleşti

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

Eşleşmedi

11124.52
234223425.345
234.
.5234
a
a.23
32.a
a.a
z548,452.22
u66.36
Cevap 29/06/2018 saat 00:49
kaynak kullanıcı

oy
0

Bu benim kullandığım budur:

+ veya lider olmadan -

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

önlerinde + veya -

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

Net keman: https://jsfiddle.net/compsult/9of63cwk/12/

Cevap 07/07/2016 saat 21:41
kaynak kullanıcı

oy
0

Eğer sen regex daha bağışlayıcı eşleşen para yapabilir insan hatası hesaba istiyorum. Ben Keng 2'nci güzel regex kullanılan ve biraz daha sağlam yazım hatası en hesaba yaptı.

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

Bu durum, bu doğru ya da parçalanmış para rakamlar herhangi maç ama uzayda sonra ucunda ekstra önemsiz almak olmaz:

$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
Cevap 05/01/2013 saat 18:15
kaynak kullanıcı

oy
0

Bu (regexs yukarıdaki bazılarından ufak tefek alarak) ile başarı elde ettik. Sadece binlerce kadar kolları, ama bu genişletmek için çok zor olmamalıdır

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)
}
Cevap 12/12/2012 saat 18:35
kaynak kullanıcı

oy
0

Ben para doğrulama için aşağıdaki normal ifadeyi kullanıyorum:

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

Ayrıca isteğe bağlı lider dolar işaretini izin verebilir:

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

Kolayca ekleyerek işareti yerine parantez için test ekleyebilir

\( and \)
Cevap 29/11/2011 saat 14:15
kaynak kullanıcı

oy
0

Ben de bu bakıyordum ve geçerli kültürün temelinde regex inşa etmek en iyisidir sonucuna vardık. Biz kullanabilirsiniz

CurrencyPositivePattern 
CurrencyGroupSeparator
CurrencyDecimalSeparator

özellikleri NumberFormatInfogerekli biçimini alır.

Düzenleme: Böyle bir şey

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

bakın - http://msdn.microsoft.com/en-us/library/hs600312.aspx

Cevap 25/08/2011 saat 07:57
kaynak kullanıcı

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