2009-03-06 32 views
8

Cụm từ thông dụng phù hợp với C# sẽ xác thực số nếu nó khớp với số sau là gì?Biểu thức chính quy C# nào sẽ xác thực tiền tệ, số dư hoặc số nguyên?

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

Hoặc tiêu cực tương đương?

+0

Bạn có cần sử dụng RegEx không? Số bạn đang tìm kiếm được nhúng trong nhiều văn bản hơn hay bạn chỉ muốn có thể phân tích một chuỗi có thể thuộc một trong các định dạng trên? –

+0

vì khi nào loại tiền tệ hợp lệ có 3 chữ số sau kỳ? – csmba

+0

@csmba Tại sao không? Giá mỗi kg sản phẩm bạn bán bằng tấn có thể đến ba chữ số thập phân. –

Trả lời

14

Bạn có thể sử dụng regex của csmba nếu bạn thực hiện một sửa đổi nhỏ cho nó.

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

cổ vũ - csamba xuất hiện để làm việc cho tôi, là có một lỗi mod này sẽ chăm sóc? – nailitdown

+0

được đánh dấu là câu trả lời vì nó thực sự cung cấp một regex làm việc – nailitdown

+0

@gwhitake Điều gì về 1235a ??? –

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

oops, nói chuyện với sớm, nó dường như chết trên số âm – nailitdown

0

Hãy thử cái này. Nó có thể cần một số tinh chỉnh để chỉ cho phép một điểm thập phân duy nhất, nhưng nó phù hợp với các trường hợp thử nghiệm của bạn. Tôi hi vọng cái này giúp được.

[$\d,.]+ 
5

Tôi nghĩ ssg là đúng. Nó không phải là một sử dụng thực sự tốt của Regex, đặc biệt là nếu phần mềm của bạn có để đối phó với mục nhập dữ liệu trung tâm không Mỹ.

Ví dụ: nếu ký hiệu tiền tệ là đồng Euro hoặc đồng Yên Nhật hoặc Bảng Anh bất kỳ ký hiệu tiền tệ nào khác trong số đó?

Điều gì về quy tắc định dạng số?

Ở Hoa Kỳ, bạn sẽ nhập 1,000,000.00 nhưng ở Pháp, điều này phải là 1.000.000,00. Các quốc gia khác cho phép khoảng cách giữa các nhóm chữ số ...

Nếu bạn sử dụng Regex thẳng mà không tính đến Văn hóa, bạn sẽ không bao giờ xác thực thành công trừ khi bạn chắc chắn 100% phần mềm của mình sẽ không bao giờ được sử dụng trong bối cảnh không tập trung vào Hoa Kỳ.

+0

+1 điểm tốt để xem xét – nailitdown

+0

+1 ditto - điểm tốt. – James

1

Hãy cẩn thận với phao nổi. Cuối cùng, bạn sẽ nhấn một trường hợp như 0,01 được biểu diễn là 0,00999999. Các chuỗi hoặc số nguyên tốt hơn để sử dụng.

0

Sử dụng biểu thức chính quy này cho tiền tệ Mỹ \ $ (\ d) * \ d Trận $ 300, $ 12900 Non-Match $ 12900,00

2

Tôi nghĩ rằng tôi đã tìm thấy một vấn đề với giải pháp SSG (hoặc có lẽ một Lỗi MS!).

Chạy này:

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

Returns đúng. Chắc chắn "0,2" không phải là một giá trị tiền tệ hợp lệ?

+0

sẽ là 0,20 ở Pháp, mexico, Tây Ban Nha hoặc bất kỳ quốc gia có nguồn gốc từ latin nào khác. Xem các bình luận ở trên về các định dạng quốc tế. Tuy nhiên, vui là khi chỉ định Hoa Kỳ bạn vẫn nhận được sự thật. Đó sẽ là một lỗi nếu nó có thể lặp lại được. –

+0

Nó thực sự xuất hiện là một lỗi MS. Dưới đây là một số kết hợp tôi đã thử trong Cửa sổ ngay lập tức: float.TryParse ("0,2", NumberStyles.Currency, CultureInfo.GetCultureInfo ("en-US"), ra num) TRẢ LẠI đúng float.TryParse ("0,2", NumberStyles.Currency, CultureInfo.GetCultureInfo ("en-AU"), số ngoài) TRẢ LẠI đúng float.TryParse ("0..2", NumberStyles.Currency, CultureInfo.GetCultureInfo ("vi -AU "), ra num) RETURNS false float.TryParse (" 0.2 ", NumberStyles.Currency, CultureInfo.GetCultureInfo (" en-AU "), ra num) RETURNS true –

+0

Không bao giờ sử dụng float cho tiền tệ !! nó có thể gây ra lỗi làm tròn ... – MistaGoustan

Các vấn đề liên quan