Ekspresi reguler sederhana untuk desimal dengan ketelitian 2

271

Apa ekspresi reguler untuk desimal dengan ketelitian 2?

Contoh yang valid :

123.12
2
56754
92929292929292.12
0.21
3.1

Contoh tidak valid:

12.1232
2.23332
e666.76

Titik desimal mungkin opsional, dan bilangan bulat juga dapat dimasukkan.

pengguna39221
sumber
1
Terkait: untuk desimal dengan pemisah ribuan, lihat stackoverflow.com/questions/16148034/...
Yeo
1
Jawaban terbaik ada di sini: stackoverflow.com/a/39399503/715269
Gangnus

Jawaban:

398

Token regex yang valid bervariasi menurut penerapan. Bentuk generik adalah:

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

Lebih kompak:

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

Keduanya berasumsi bahwa keduanya memiliki setidaknya satu digit sebelum dan satu setelah tempat desimal.

Untuk mengharuskan seluruh string adalah sejumlah formulir ini, bungkus ekspresi dalam tag awal dan akhir seperti (dalam bentuk Perl):

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

Untuk mencocokkan angka tanpa digit terdepan sebelum desimal ( .12) dan seluruh angka memiliki periode trailing ( 12.) sambil mengecualikan input periode tunggal ( .), coba yang berikut ini:

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

Ditambahkan

Membungkus bagian pecahan ()?untuk membuatnya opsional. Perlu diketahui bahwa ini mengecualikan formulir seperti 12. Termasuk yang akan lebih seperti ^\d+\\.?\d{0,2}$.

Ditambahkan

Gunakan ^\d{1,6}(\.\d{1,2})?$untuk menghentikan pengulangan dan memberikan batasan untuk seluruh bagian dari nilai desimal.

DocMax
sumber
4
Secara matematis, saya pikir angka 2 presisi harus selalu memiliki dua desimal bahkan jika yang terakhir adalah nol. Ini berdasarkan pengalaman saya dengan angka-angka signifikan sehingga bisa salah, tetapi Anda tidak benar-benar tahu apakah 1,7 adalah 1,70 atau angka dari 1,70 hingga 1,74.
paxdiablo
Terima kasih! Itulah yang saya butuhkan :) +1
alex
6
ini cocok dengan 0001.00: /
redben
2
Menambahkan '-?' dalam hal ini ^ \ d + (\. \ d {1,2})? $ ===> ^ -? \ d + (\. \ d {1,2})? $ untuk mendukung -ve
Murali Murugesan
1
@BimalDas, Anda dapat mendukung negatif dengan mengawali ekspresi dengan -?, seperti pada -?\d+(\.\d{1,2})?. Saya tidak memasukkan negatif atau mulai dengan titik desimal karena tidak ada dalam pertanyaan OP, meskipun mereka pasti valid untuk format angka yang lebih umum. Utas komentar di sini memberikan beberapa cara untuk menangani ".21".
DocMax
276
^[0-9]+(\.[0-9]{1,2})?$

Dan karena ekspresi reguler mengerikan untuk dibaca, apalagi dipahami, inilah persamaan verbose:

^                         # 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

Anda dapat menggantinya [0-9]dengan \dsebagian besar implementasi ekspresi reguler (termasuk PCRE , yang paling umum). Saya meninggalkannya [0-9]karena saya pikir itu lebih mudah dibaca.

Juga, ini adalah skrip Python sederhana yang saya gunakan untuk memeriksanya:

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
dbr
sumber
Saya ingin maks 3 digit sebelum desimal, mencoba seperti ini tanpa hasil ^ ([0-9] {0,3}) + (\. [0-9] {1,2})? $
Raghurocks
3
@Raghurocks Hapus +setelah paren penutupan pertama,^([0-9]{0,3})(\.[0-9]{1,2})?$
dbr
Untuk pengguna Java: desimal tidak boleh diloloskan.
3
@Gracchus Anda yakin? Mungkin seharusnya \\.bukan \.karena .akan terlihat berfungsi, tetapi cocok dengan karakter apa pun (bukan hanya tempat desimal). Misalnya, keduanya 1z23dan 1.23mungkin dianggap sah jika Anda tidak menghindarinya
dbr
@ dbr Mungkin memang seharusnya begitu. Java hanya mengeluhkan pelarian yang tidak patut. Menghapus "memperbaikinya" (diam), lol. Saya belum punya kesempatan untuk mengujinya sepenuhnya.
20

Untuk memasukkan tanda minus opsional dan untuk melarang angka seperti 015(yang dapat disalahartikan sebagai angka oktal) tulis:

-?(0|([1-9]\d*))(\.\d+)?
Karol Bienkowski
sumber
Ini memungkinkan alpha sebelum desimal untuk saya. Mengizinkan X.25
BengalTigger
1
Ini tidak membatasi jumlah tempat desimal ke 2.
Dawood ibn Kareem
13

Untuk angka yang tidak memiliki pemisah ribuan, saya suka regex sederhana dan ringkas ini:

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

atau, tidak terbatas pada ketelitian 2:

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

Yang terakhir cocok dengan
1
100
100.
100,74
100,7
0,7
0,7
.72

Dan itu tidak cocok dengan string kosong (seperti \ d *.? \ D * akan)

Jimmy
sumber
7

Saya menggunakan ini sampai dua tempat desimal:
(^(\+|\-)(0|([1-9][0-9]*))(\.[0-9]{1,2})?$)|(^(0{0,1}|([1-9][0-9]*))(\.[0-9]{1,2})?$) melewati:
0,25
0,25
10,25
0,25

tidak lulus:
-.25
01.25
1.
1,256

pengguna regex frustrasi
sumber
Ini juga melewati nilai kosong.
BengalTigger
7
^[0-9]+(\.([0-9]{1,2})?)?$

Akan membuat hal-hal seperti 12.diterima. Ini bukan yang umum diterima tetapi jika Anda perlu "fleksibel", itu adalah salah satu cara untuk pergi. Dan tentu saja [0-9]bisa diganti dengan \d, tapi saya kira lebih mudah dibaca dengan cara ini.

BSharper
sumber
5

Coba ini

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

Ini akan memungkinkan tanda-tanda positif dan negatif juga.

Android
sumber
3

Jawaban utama SALAH karena valid 5.atau 5,input

kode ini menanganinya (tetapi dalam contoh saya angka negatif dilarang):

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

hasilnya di bawah ini:

true => "0" / true => "0,00" / true => "0,0" / true => "0,00" / true => "0,0" / true => "1,2" true => "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" / true => "100.01" / true => "100.2" / true => "00" / false => "5." / false => "6," / true => "82" / true => "81,3" / true => "

Vivien Pipo
sumber
2
preg_match("/^-?\d+[\.]?\d\d$/", $sum)
DEC32
sumber
2

Secara umum, yaitu tempat desimal tak terbatas:

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

SK9
sumber
1

Tidak akan Anda perlu mengambil edi e666.76dalam akun?

Dengan

(e|0-9)\d*\d.\d{1,2)
spacemonkeys
sumber
Tidak, itu akan keluar dari ruang lingkup proyek! terima kasih, ini berguna :)
user39221
1

menambahkan jawaban saya juga, seseorang mungkin menemukan itu berguna atau mungkin juga milik saya.

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


alert(getInteger('-11.11'));
BAJA
sumber
1

Ini bekerja dengan saya:

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

Grup 1 adalah angka float Anda dan grup 2 adalah fraksi saja.

Sherif yang teduh
sumber
1

Saya mencoba satu dengan proyek saya. Ini memungkinkan angka dengan + | -tanda juga.

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

Chrome 56 tidak menerima pola semacam ini (Chrome 56 menerima 11.11. Tambahan.) Dengan nomor jenis, gunakan jenis sebagai teks sebagai kemajuan.

rajesh_kw
sumber
0

Ini akan memungkinkan desimal dengan eksponensial dan hingga 2 digit,

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

Demo

Nambi_0915
sumber
Itu juga tidak cocok dengan integer1.2e-10
Toto
Ya, terima kasih atas koreksi Anda. Saya pikir ini hanya untuk angka desimal
Nambi_0915
([0-9]+)?lebih baik ditulis \d*. Sekarang tidak cocok 10e3. Dan OP ingin mencocokkan hingga 2 digit.
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');
            }
    }

fungsi akan memvalidasi angka cuaca apa pun nomor desimal memiliki tempat desimal atau tidak, ia akan mengatakan "Nomor Kanan" bijaksana "Silakan masukkan hanya angka ke dalam kotak teks jumlah." pesan peringatan akan muncul.

Terima kasih ... :)

Bhanu Pratap
sumber