2012-01-12 43 views
13

Tôi biết điều này đã được thực hiện hàng nghìn lần trước nhưng tôi gặp sự cố khi nhận được quyền này. Tôi cần phải định dạng giá trị của một đầu vào văn bản cho số tiền đô la. Không được phép sử dụng dấu phẩy. Chỉ cho phép hai chữ số thập phân. Các ví dụ về những gì nên được phép:Biểu thức chính quy cho số tiền bằng USD trong JavaScript

  • 100,10
  • $ 100
  • $ 100,25

Dưới đây là biểu hiện thường xuyên không đầy đủ hiện tại của tôi. Nó hiện đang cho phép nhiều dấu đô la được bao gồm bất cứ nơi nào (không chỉ ở đầu), nhiều điểm thập phân được bao gồm bất cứ nơi nào, và nhiều hơn hai chữ số thập phân mà nó không nên.

<head> 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript" language="Javascript"> 
    $(function(){ 

     jQuery('.dollarAmountOnly').keyup(function() { 
      this.value = this.value.replace(/[^$0-9\.]/g, ''); 
     }); 
    }); 
</script> 
</head> 
<body> 
<input type="text" class="dollarAmountOnly"/> 
</body> 
</html> 

tôi sẽ đánh giá rất cao sự giúp đỡ. Cảm ơn!

Trả lời

27

EDIT

Xin lỗi, câu hỏi của bạn hỏi rõ ràng cho chính xác hai chữ số thập phân. Đây là những gì bạn muốn:

var r = /^\$?[0-9]+(\.[0-9][0-9])?$/; 

console.log(r.test("12.55")); //true 
console.log(r.test("$12.55")); //true 
console.log(r.test("$12"));  //true 

console.log(r.test("$12.")); //false 
console.log(r.test("$12.2")); //false 
console.log(r.test("$$12"));  //false 
console.log(r.test("$12.555")); //false 

Bạn phải thoát khỏi dấu đô la của bạn, sau đó bạn muốn hai tùy chọn chữ số sau dấu thập phân:

var r = /^\$?[0-9]+\.?[0-9]?[0-9]?$/; 

console.log(r.test("12.55")); //true 
console.log(r.test("$12.55")); //true 
console.log(r.test("$12.")); //true 
console.log(r.test("$12"));  //true 

console.log(r.test("$$12"));  //false 
console.log(r.test("$12.555")); //false 

Fiddle

Hoặc, để cho phép các chữ số tùy ý sau dấu thập phân, bạn có thể sử dụng một đóng cửa Kleene thay vì hai chữ số tùy chọn

var r = /^\$?[0-9]+\.?[0-9]*$/; 

console.log(r.test("12.55")); //true 
console.log(r.test("$12.55")); //true 
console.log(r.test("$12.")); //true 
console.log(r.test("$12"));  //true 
console.log(r.test("$12.555")); //true 

console.log(r.test("$$12"));  //false 
+0

Cảm ơn đã phản ứng. Tôi đã thử regex của bạn nhưng nó vẫn cho phép nhiều dấu hiệu đô la. – SquidScareMe

+0

@SquidScareMe - bạn có chắc không? Hai dấu hiệu đô la không thành công cho tôi –

+0

@AdamRackis người hỏi cũng không muốn $ yêu cầu, nhưng tối đa một cho phép {0,1} sẽ hoạt động đúng không? – Jordan

3

Tôi khuyên bạn nên thực hiện xác thực không trên .keyup (ví dụ như loại người dùng), nhưng khi người dùng gửi biểu mẫu.

Sau đó thay vì thay thế các ký tự không hợp lệ, bạn chỉ có thể xác minh rằng hộp văn bản dollarAmountOnly khớp với đúng regex.

Một regex cho giá hợp lệ là (điều này cho phép trailing/không gian hàng đầu):

/^ *\$?\d+(?:\.\d{2})? *$/g 

Vì vậy, khi người dùng nhấn gửi, bạn xem nếu regex phù hợp dollarAmountOnly, và nếu không sau đó cho phép người dùng biết bằng cách nào đó .

+0

Cảm ơn bạn đã phản hồi. Thật không may là yêu cầu phải xác thực là loại người dùng. – SquidScareMe

+0

Nếu bạn quan tâm có một nghiên cứu về A List Apart bao gồm [khi xác thực khi thực hiện xác thực nội tuyến] (http://alistapart.com/article/inline-validation-in-web-forms#section4). Để chỉ nói "không làm điều đó trên keyup" là một chút của một quá đơn giản. Họ tìm thấy nó tốt nhất để làm điều đó trên chính sau một sự chậm trễ ngắn. – user2449231

8

Đối với những người trong chúng ta muốn cho phép một dấu phẩy, đây là regex cho rằng:

/^\$?\d+(,\d{3})*\.?[0-9]?[0-9]?$/ 

tôi chủ trương cho phép nó và loại bỏ các dấu phẩy trên backend nếu bạn không thực sự muốn họ. Bất cứ điều gì để làm cho nó dễ dàng hơn cho người dùng.Jakob Nielson discusses cumbersome forms at point #7.

+2

Cải thiện nhẹ, điều này cho phép vị trí thập phân, nhưng yêu cầu phải tồn tại hai địa điểm sau giai đoạn, nếu một khoảng thời gian được nhập: '/^\$?\d+(,\d{3})*(\.[0-9 ] {2})? $/'Đó là sự kết hợp giữa bạn và người khác mà tôi đã sử dụng trong một thời gian mà tôi cũng tìm thấy ở đâu đó trên Stack Overflow mà tôi tin. – trevorhinesley

+0

@ user2449231 đây là một ứng dụng tuyệt vời! Bạn có thể đăng bài này bằng cách thêm dấu phẩy cho phép không? – BenRacicot

0

Đây là một regex tôi được sử dụng để xác định khác nhau tệ trong javascript:

_this.currencyRegex = /^(\$|\€\£|\₪|)(?!0\.00)\d{1,3}(,\d{3})*(\.\d\d)?$/; 

và một công cụ tốt để gỡ lỗi:

https://regex101.com/r/hL2pF2/26

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