2009-03-06 15 views
8

Aşağıdakilerle eşleşiyorsa, C# için uygun olan düzenli bir ifade nedir?Para, kayan veya tamsayı doğrulayacak bir C# normal ifadesi nedir?

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

Veya negatif eşdeğerleri?

+0

RegEx'i kullanmanız gerekiyor mu? Aradığınız metin daha fazla metne gömülmüş mü yoksa sadece yukarıdaki biçimlerden birinde olabilecek bir dizeyi ayrıştırmak mı istiyorsunuz? –

+0

tarihinden itibaren geçerli para biriminin ne zamandan beri 3 haneli olduğu var? – csmba

+0

@csmba Neden olmasın? Ton olarak satacağınız bir ürünün kilogramı başına maliyeti üç ondalık basamağa kadar çıkabilir. –

cevap

14

Bir küçük değişiklik yaparsanız csmba'nın normal ifadesini kullanabilirsiniz.

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

neşeyle ölüyor gibi görünüyor - csamba'nın benim için işe yaradığı görüldü, bu modun halledilmesi gereken bir hata var mı? – nailitdown

+0

aslında bir çalışma regex sağladı çünkü yanıt olarak işaretlendi – nailitdown

+0

@gwhitake Ne hakkında 1235a ??? –

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

oops, yakında konuştu, negatif sayılarda – nailitdown

0

Bunu deneyin. Yalnızca bir ondalık noktaya izin vermek için bazı ince ayarlara ihtiyaç duyulabilir, ancak test durumlarınızla eşleşir. Umarım bu yardımcı olur.

[$\d,.]+ 
5

Sanırım ssg haklı. Özellikle yazılımınız ABD merkezli olmayan veri girişi ile uğraşmak zorundaysa, Regex'in gerçekten iyi bir kullanımı değildir.

Örneğin, para birimi simgesi Avro mu, yoksa Japon Yeni mi yoksa İngiliz Poundu mu yoksa diğer düzine para birimi simgelerinden biri mi?

Numara biçimlendirme kuralları nedir?

ABD'de 1,000,000.00 girebilirsiniz, ancak Fransa'da bu 1.000.000,00 olmalıdır. Diğer ülkeler rakam gruplaması arasında boşluk bırakılmasına izin verir ...

Kültürü hesaba katmadan düz bir Regex kullanırsanız, yazılımınızın asla% 100 emin olmadıkça, hiçbir zaman başarılı bir şekilde doğrulamayacaksınız. ABD merkezli olmayan bir bağlamda kullanılır.

+0

+1 iyi düşünülmesi gereken noktalar – nailitdown

+0

+1 ditto - iyi puanlar. – James

1

Şamandıralara dikkat edin. Sonunda 0.00999999 olarak temsil edilen 0,01 gibi bir davayı vuracaksınız. Dizeler veya tamsayılar kullanmak daha iyidir.

0

Kullanım ABD para birimi \ $ için bu düzenli ifade (\ d) * \ d 300 $, Maçlar $ 12.900 -Match Sigara $ 12.900,00

2

ben SSG çözümü ile ilgili bir sorun buldum (ya da belki de bir MS hatası!).

bu Running:

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

döndürür doğru. Kesinlikle "0,2" geçerli bir para birimi değil mi?

+0

, Fransa, meksika, ispanya ya da diğer herhangi bir latin türetilmiş ülkede .20 olacaktır. Yukarıdaki yorumları uluslararası formatlarda görün. Ancak, komik, ABD'yi belirlerken hala doğru oluyorsunuz. Tekrarlanabilirse bu bir hata olur. –

+0

Gerçekten bir MS hatası gibi görünüyor. Immediate Penceresinde denediğim bazı kombinasyonlar şunlardır: Float.TryParse ("0,2", NumberStyles.Currency, CultureInfo.GetCultureInfo ("en-US"), num) RETURNS true float.TryParse ("0,2", NumberStyles.Currency, CultureInfo.GetCultureInfo ("en-AU"), num) RETURNS true float.TryParse ("0..2", NumberStyles.Currency, CultureInfo.GetCultureInfo ("tr -AU "), sayı) RETURNS false float.TryParse (" 0.2 ", NumberStyles.Currency, CultureInfo.GetCultureInfo (" en-AU "), num) GERİ VERME true –

+0

Asla para birimi için float kullanmayın !! yuvarlama hatalarına neden olabilir ... – MistaGoustan