Biểu thức chính quy đơn giản cho một số thập phân với độ chính xác là 2


271

Biểu thức chính quy cho số thập phân có độ chính xác là 2 là gì?

Ví dụ hợp lệ :

123.12
2
56754
92929292929292.12
0.21
3.1

Ví dụ không hợp lệ:

12.1232
2.23332
e666.76

Dấu thập phân có thể là tùy chọn và số nguyên cũng có thể được bao gồm.


1
Liên quan: để biết số thập phân với dấu phân cách thứ nghìn, hãy xem stackoverflow.com/questions/16148034/ trên
Yeo

1
Câu trả lời tốt nhất là ở đây: stackoverflow.com/a/39399503/715269
Gangnus

Câu trả lời:


397

Mã thông báo regex hợp lệ thay đổi tùy theo triển khai. Một hình thức chung là:

[0-9]+(\.[0-9][0-9]?)?

Nhỏ gọn hơn:

\d+(\.\d{1,2})?

Cả hai đều cho rằng cả hai đều có ít nhất một chữ số trước và một chữ số sau chữ số thập phân.

Để yêu cầu toàn bộ chuỗi là một số của biểu mẫu này, hãy bọc biểu thức trong các thẻ bắt đầu và kết thúc, chẳng hạn như (ở dạng của Perl):

^\d+(\.\d{1,2})?$

Để khớp các số không có chữ số đứng trước số thập phân ( .12) và toàn bộ số có dấu chấm ( 12.) trong khi loại trừ đầu vào của một khoảng thời gian duy nhất ( .), hãy thử cách sau:

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

Thêm

Gói phần phân đoạn vào ()?để làm cho nó tùy chọn. Xin lưu ý rằng điều này không bao gồm các hình thức như 12. Bao gồm sẽ giống hơn ^\d+\\.?\d{0,2}$.

Thêm

Sử dụng ^\d{1,6}(\.\d{1,2})?$để dừng lặp lại và đưa ra hạn chế cho toàn bộ phần giá trị thập phân.


4
Về mặt toán học, tôi nghĩ rằng một số 2 chính xác phải luôn có hai số thập phân ngay cả khi số cuối cùng bằng không. Điều này dựa trên kinh nghiệm của tôi với các số liệu quan trọng nên có thể sai, nhưng bạn thực sự không biết liệu 1.7 là 1.70 hay bất kỳ số nào từ 1.70 đến 1.74.
paxdiablo

Cảm ơn! Chính xác là những gì tôi cần :) +1
alex

6
trận đấu này 0001.00: /
redben

2
Thêm '-?' trong này ^ \ d + (\. \ d {1,2})? $ ===> ^ -? \ d + (\. \ d {1,2})? $ để hỗ trợ -ve
Murali Murugesan

1
@BimalDas, bạn có thể hỗ trợ phủ định bằng cách thêm tiền tố vào biểu thức với -?, như trong -?\d+(\.\d{1,2})?. Tôi không bao gồm phủ định hoặc bắt đầu bằng dấu thập phân vì những điểm đó không có trong câu hỏi của OP, mặc dù chúng chắc chắn hợp lệ cho định dạng số chung hơn. Chủ đề bình luận ở đây đưa ra một vài cách để xử lý ".21".
DocMax

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

Và vì các biểu thức thông thường là khủng khiếp để đọc, ít hiểu hơn, đây là tương đương dài dòng:

^                         # Start of string
 [0-9]+                   # Require one or more numbers
       (                  # Begin optional group
        \.                # Point must be escaped or it is treated as "any character"
          [0-9]{1,2}      # One or two numbers
                    )?    # End group--signify that it's optional with "?"
                      $   # End of string

Bạn có thể thay thế [0-9]bằng \dhầu hết các triển khai biểu thức chính quy (bao gồm PCRE , phổ biến nhất). Tôi đã để nó như [0-9]tôi nghĩ nó dễ đọc hơn.

Ngoài ra, đây là tập lệnh Python đơn giản mà tôi đã sử dụng để kiểm tra nó:

import re
deci_num_checker = re.compile(r"""^[0-9]+(\.[0-9]{1,2})?$""")

valid = ["123.12", "2", "56754", "92929292929292.12", "0.21", "3.1"]
invalid = ["12.1232", "2.23332", "e666.76"]

assert len([deci_num_checker.match(x) != None for x in valid]) == len(valid)
assert [deci_num_checker.match(x) == None for x in invalid].count(False) == 0

Tôi muốn tối đa 3 chữ số trước số thập phân, đã thử như thế này mà không gặp may mắn ^ ([0-9] {0,3}) + (\. [0-9] {1,2})? $
Raghurocks

3
@Raghurocks Xóa +sau khi đóng paren đầu tiên,^([0-9]{0,3})(\.[0-9]{1,2})?$
dbr

Đối với người dùng Java: không nên thoát số thập phân.

3
@Gracchus Bạn có chắc không? Có lẽ nó nên \\.thay \.vì bởi vì .nó sẽ trông giống như nó hoạt động, nhưng phù hợp với bất kỳ ký tự nào (không chỉ là vị trí thập phân). Ví dụ: cả hai 1z231.23có thể được coi là hợp lệ nếu bạn không thoát khỏi nó
dbr

@dbr Có lẽ đó là những gì nó nên được. Java chỉ phàn nàn về việc trốn thoát không đúng cách. Loại bỏ "đã sửa nó" (tắt nó đi), lol. Tôi chưa có cơ hội kiểm tra đầy đủ.

20

Để bao gồm một dấu trừ tùy chọn và không cho phép các số như 015(có thể bị nhầm với số bát phân), hãy viết:

-?(0|([1-9]\d*))(\.\d+)?

Điều này cho phép alpha trước số thập phân cho tôi. Cho phép X.25
BengalTigger

1
Điều này không giới hạn số vị trí thập phân là 2.
Dawood ibn Kareem

13

Đối với các số không có dấu phân cách hàng nghìn, tôi thích biểu thức đơn giản, nhỏ gọn này:

\d+(\.\d{2})?|\.\d{2}

hoặc, không bị giới hạn ở độ chính xác 2:

\d+(\.\d*)?|\.\d+

Cái sau khớp với
1
100
100.
100,74
100,7
0,7
.7
.72

Và nó không khớp với chuỗi rỗng (như \ d *.? \ D * would)


7

Tôi sử dụng cái này cho tối đa hai chữ số thập phân:
(^(\+|\-)(0|([1-9][0-9]*))(\.[0-9]{1,2})?$)|(^(0{0,1}|([1-9][0-9]*))(\.[0-9]{1,2})?$) pass:
.25
0.25
10.25
+0.25

không vượt qua:
-.25
01.25
1.
1.256


Điều này cũng vượt qua một giá trị trống.
BengalTigger

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

Sẽ làm cho mọi thứ như 12.được chấp nhận. Đây không phải là những gì thường được chấp nhận nhưng nếu trong trường hợp bạn cần phải linh hoạt, thì đó là một cách để đi. Và tất nhiên [0-9]có thể được thay thế bằng \d, nhưng tôi đoán nó dễ đọc hơn theo cách này.


5

Thử cái này

 (\\+|-)?([0-9]+(\\.[0-9]+))

Nó cũng sẽ cho phép các dấu hiệu tích cực và tiêu cực.


3

Câu trả lời chính là SAI vì nó có giá trị 5.hoặc 5,đầu vào

mã này xử lý nó (nhưng trong ví dụ số âm của tôi bị cấm):

/^[0-9]+([.,][0-9]{1,2})?$/;

kết quả dưới đây:

đúng => "0" / đúng => "0,00" / đúng => "0,0" / đúng => "0,00" / đúng => "0,0" / đúng => "1,2" đúng => "1.1" / true => "1" / true => "100" true => "100.00" / true => "100.0" / true => "1.11" / true => "1.11" / false => "-5" / false => "-0.00" / true => "101" / false => "0.00.0" / true => "0.000" / true => "000.25" / false => ".25" / đúng => "100,01" / đúng => "100,2" / đúng => "00" / sai => "5." / sai => "6," / đúng => "82" / đúng => "81,3" / đúng => "



2

Nói chung, tức là số thập phân không giới hạn:

^-?(([1-9]\d*)|0)(.0*[1-9](0*[1-9])*)?$.


1

Sẽ không bạn cần phải thực hiện etronge666.76 vào tài khoản?

Với

(e|0-9)\d*\d.\d{1,2)

Không, đó sẽ là ngoài phạm vi của dự án! mặc dù cảm ơn, nó rất tiện lợi :)
user39221

1

thêm câu trả lời của tôi nữa, ai đó có thể thấy nó hữu ích hoặc cũng có thể là chính xác của tôi.

function getInteger(int){
  var regx = /^[-+]?[\d.]+$/g;
  return regx.test(int);
}


alert(getInteger('-11.11'));

1

Điều này đã làm việc với tôi:

(-?[0-9]+(\.[0-9]+)?)

Nhóm 1 là số float của bạn và nhóm 2 chỉ là phân số.


1

Tôi đã thử một với dự án của tôi. Điều này cho phép số có + | -dấu hiệu là tốt.

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

0

Chrome 56 không chấp nhận loại mẫu này (Chrome 56 đang tích lũy 11.11. Bổ sung.) Với số loại, sử dụng loại làm văn bản làm tiến trình.


0

Điều này sẽ cho phép số thập phân với số mũ và tối đa 2 chữ số,

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

Bản giới thiệu


Điều đó không khớp với số nguyên cũng không1.2e-10
Toto

Vâng, cảm ơn bạn đã sửa chữa của bạn. Tôi nghĩ rằng nó chỉ dành cho số thập phân
Nambi_0915

([0-9]+)? được viết tốt hơn \d* . Bây giờ nó không phù hợp 10e3. Và OP muốn khớp tối đa 2 chữ số.
Toto

-1
 function DecimalNumberValidation() {
        var amounttext = ;
            if (!(/^[-+]?\d*\.?\d*$/.test(document.getElementById('txtRemittanceNumber').value))){
            alert('Please enter only numbers into amount textbox.')
            }
            else
            {
            alert('Right Number');
            }
    }

Hàm sẽ xác nhận bất kỳ số thập phân số thời tiết có vị trí thập phân hay không, nó sẽ nói "Đúng số" khác "Vui lòng chỉ nhập số vào hộp văn bản số lượng." tin nhắn cảnh báo sẽ đến

Cảm ơn... :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.