Proste wyrażenie regularne po przecinku z dokładnością do 2


271

Jakie jest wyrażenie regularne po przecinku z dokładnością do 2?

Prawidłowe przykłady :

123.12
2
56754
92929292929292.12
0.21
3.1

Nieprawidłowe przykłady:

12.1232
2.23332
e666.76

Kropka dziesiętna może być opcjonalna, a także liczby całkowite.


1
Powiązane: dziesiętne z separatorem tysięcznym, patrz stackoverflow.com/questions/16148034/...
Yeo

1
Najlepsza odpowiedź jest tutaj: stackoverflow.com/a/39399503/715269
Gangnus

Odpowiedzi:


397

Prawidłowe tokeny wyrażeń regularnych różnią się w zależności od implementacji. Ogólna forma to:

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

Bardziej kompaktowy:

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

Obie zakładają, że obie mają co najmniej jedną cyfrę przed i po kropce dziesiętnej.

Aby wymagać, aby cały ciąg był liczbą tego formularza, zawiń wyrażenie w znaczniki początkowe i końcowe, takie jak (w formie Perla):

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

Aby dopasować liczby bez wiodącej cyfry przed przecinkiem ( .12) i liczby całkowite o kropce ( ) 12., wyłączając wprowadzanie pojedynczej kropki ( .), spróbuj wykonać następujące czynności:

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

Dodany

Owinięto część ułamkową, ()?aby była opcjonalna. Pamiętaj, że wyklucza to formy takie jak 12. Uwzględnianie, które byłyby bardziej podobne ^\d+\\.?\d{0,2}$.

Dodany

Służy ^\d{1,6}(\.\d{1,2})?$do zatrzymania powtarzania i ograniczenia całej wartości dziesiętnej.


4
Matematycznie myślę, że dokładność liczby 2 powinna zawsze mieć dwa miejsca po przecinku, nawet jeśli ostatni wynosi zero. Opiera się to na moim doświadczeniu ze znaczącymi liczbami, więc może się mylić, ale tak naprawdę nie wiesz, czy 1,7 to 1,70, czy dowolna liczba od 1,70 do 1,74.
paxdiablo

Dzięki! Był dokładnie tym, czego potrzebowałem :) +1
alex

6
pasuje do 0001,00: /
redben 21.01.12

2
Dodany '-?' w tym ^ \ d + (\. \ d {1,2})? $ ===> ^ -? \ d + (\. \ d {1,2})? $ za wsparcie -ve
Murali Murugesan

1
@BimalDas, możesz obsługiwać negatywy, poprzedzając je wyrażeniem -?, jak w -?\d+(\.\d{1,2})?. Nie uwzględniłem negatywów ani rozpoczynających się od kropki dziesiętnej, ponieważ nie były one w pytaniu PO, chociaż z pewnością są one ważne dla bardziej ogólnego formatu liczb. Wątek komentarzy tutaj podaje kilka sposobów obsługi „.21”.
DocMax,

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

A ponieważ wyrażenia regularne są okropne do czytania, a tym bardziej nie rozumiem, oto pełny odpowiednik:

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

Można wymienić [0-9]z \dwiększości zwykłych implementacjach ekspresji (w tym PCRE , najczęstszym). Zostawiłem to, ponieważ [0-9]uważam, że łatwiej jest je czytać.

Oto prosty skrypt Pythona, którego użyłem do sprawdzenia:

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

Chcę maksymalnie 3 cyfry po przecinku, próbowałem w ten sposób bez powodzenia ^ ([0-9] {0,3}) + (\. [0-9] {1,2})? $
Raghurocks

3
@Raghurocks Usuń +po pierwszym zamykającym paren,^([0-9]{0,3})(\.[0-9]{1,2})?$
dbr

Dla użytkowników Java: przecinek dziesiętny nie powinien być poprzedzony znakiem ucieczki.

3
@Gracchus Czy jesteś pewien? Prawdopodobnie powinno być \\.zamiast, \.ponieważ .będzie wyglądać, jakby działało, ale pasuje do dowolnego znaku (nie tylko miejsca po przecinku). Na przykład, zarówno 1z23i 1.23może być uznany za ważny, jeśli nie uciec
DBR

@dbr Może właśnie tak powinno być. Java skarżyła się na niewłaściwe ucieczkę. Usuwanie tego „naprawiłem” (zamknij), lol. Nie miałem jeszcze okazji w pełni go przetestować.

20

Aby dołączyć opcjonalny znak minus i zabronić liczb takich jak 015(które można pomylić z liczbami ósemkowymi):

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

To dla mnie pozwala na alfa przed przecinkiem. Pozwala X.25
BengalTigger

1
Nie ogranicza to liczby miejsc dziesiętnych do 2.
Dawood ibn Kareem

13

W przypadku liczb, które nie mają separatora tysięcy, podoba mi się ta prosta, zwarta regex:

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

lub, nie ograniczając się do dokładności 2:

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

Ta ostatnia odpowiada
1
100
100.
100,74
100,7
0,7
.7
.72

I nie pasuje do pustego ciągu (jak \ d *.? \ D * zrobiłby)



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

Sprawi, że rzeczy będą 12.akceptowane. Nie jest to powszechnie akceptowane, ale jeśli trzeba być „elastycznym”, to jest jedna droga. I oczywiście [0-9]można go zastąpić \d, ale wydaje mi się, że w ten sposób jest bardziej czytelny.


5

Spróbuj tego

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

Pozwoli to również na znaki pozytywne i negatywne.


3

Główna odpowiedź jest NIEPRAWIDŁOWA, ponieważ jest ważna 5.lub5, dane wejściowe

obsłuży go ten kod (ale w moim przykładzie liczby ujemne są zabronione):

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

wyniki są poniżej:

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 => ”



2

Ogólnie, tj. Nieograniczona liczba miejsc po przecinku:

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


1

Nie będzie trzeba podjąć ew e666.76pod uwagę?

Z

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

Nie, to byłoby poza zakresem projektu! dzięki, ale jest to przydatne :)
user39221

1

dodając moją odpowiedź, ktoś może uznać ją za przydatną lub może być poprawną moją.

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


alert(getInteger('-11.11'));

1

To zadziałało ze mną:

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

Grupa 1 to liczba zmiennoprzecinkowa, a grupa 2 to tylko ułamek.


1

Próbowałem jednego z moim projektem. Pozwala to również na liczby ze + | -znakami.

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

0

Chrome 56 nie akceptuje tego rodzaju wzorców (Chrome 56 akceptuje 11.11. Dodatkowy.) Z numerem typu, użyj tekstu jako tekstu jako postępu.


0

Pozwoli to na dziesiętne z potęgowaniem i do 2 cyfr,

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

Próbny


To nie pasuje do liczby całkowitej ani1.2e-10
Toto

Tak, dziękuję za korektę. Myślałem, że to tylko dla liczb dziesiętnych
Nambi_0915

([0-9]+)?jest lepiej napisane \d*. Teraz to nie pasuje 10e3. A OP chce dopasować do 2 cyfr.
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');
            }
    }

funkcja sprawdzi poprawność dowolnej liczby dziesiętnej liczba pogody ma miejsca dziesiętne lub nie, powie „Właściwy numer” w innym przypadku „Wprowadź tylko liczby w polu tekstowym kwoty”. pojawi się komunikat ostrzegawczy.

Dzięki... :)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.