Einfacher regulärer Ausdruck für eine Dezimalstelle mit einer Genauigkeit von 2

271

Was ist der reguläre Ausdruck für eine Dezimalstelle mit einer Genauigkeit von 2?

Gültige Beispiele :

123.12
2
56754
92929292929292.12
0.21
3.1

Ungültige Beispiele:

12.1232
2.23332
e666.76

Der Dezimalpunkt kann optional sein, und es können auch Ganzzahlen enthalten sein.

user39221
quelle
1
Verwandte: für Dezimalstellen mit tausendsten Trennzeichen, siehe stackoverflow.com/questions/16148034/…
Yeo
1
Die beste Antwort ist hier: stackoverflow.com/a/39399503/715269
Gangnus

Antworten:

397

Gültige Regex-Token variieren je nach Implementierung. Eine generische Form ist:

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

Kompakter:

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

Beide gehen davon aus, dass beide mindestens eine Ziffer vor und eine nach der Dezimalstelle haben.

Um zu erfordern, dass die gesamte Zeichenfolge eine Nummer dieses Formulars ist, setzen Sie den Ausdruck in Start- und End-Tags wie (in Perls Form):

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

Versuchen Sie Folgendes, um Zahlen ohne führende Ziffer vor der Dezimalstelle ( .12) und ganze Zahlen mit einer nachgestellten Periode ( 12.) abzugleichen, ohne die Eingabe einer einzelnen Periode ( .) auszuschließen :

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

Hinzugefügt

Wickelte den Bruchteil ein ()?, um ihn optional zu machen. Beachten Sie, dass dies Formulare wie das 12. Einschließen ausschließt, die eher so aussehen würden ^\d+\\.?\d{0,2}$.

Hinzugefügt

Verwenden Sie ^\d{1,6}(\.\d{1,2})?$diese Option , um die Wiederholung zu stoppen und den gesamten Teil des Dezimalwerts einzuschränken.

DocMax
quelle
4
Mathematisch denke ich, dass eine Präzisionszahl 2 immer zwei Dezimalstellen haben sollte, selbst wenn die letzte Null ist. Dies basiert auf meiner Erfahrung mit signifikanten Zahlen, so dass es falsch sein könnte, aber Sie wissen nicht wirklich, ob 1,7 1,70 oder eine Zahl von 1,70 bis 1,74 ist.
Paxdiablo
Vielen Dank! War genau das, was ich brauchte :) 1
alex
6
Dies entspricht 0001.00: /
Redben
2
Hinzugefügt '-?' in diesem ^ \ d + (\. \ d {1,2})? $ ===> ^ -? \ d + (\. \ d {1,2})? $ für die Unterstützung von -ve
Murali Murugesan
1
@BimalDas, Sie können Negative unterstützen, indem Sie dem Ausdruck -?wie in voranstellen -?\d+(\.\d{1,2})?. Ich habe keine Negative aufgenommen oder mit einem Dezimalpunkt begonnen, da diese nicht in der Frage des OP standen, obwohl sie sicherlich für ein allgemeineres Zahlenformat gelten. Der Kommentarthread hier bietet einige Möglichkeiten, mit ".21" umzugehen.
DocMax
275
^[0-9]+(\.[0-9]{1,2})?$

Und da reguläre Ausdrücke schrecklich zu lesen und noch weniger zu verstehen sind, ist hier das ausführliche Äquivalent:

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

Sie können in den meisten Implementierungen [0-9]mit \dregulären Ausdrücken (einschließlich PCRE , der am häufigsten verwendeten) ersetzen . Ich habe es so belassen, wie [0-9]ich denke, dass es einfacher zu lesen ist.

Hier ist auch das einfache Python-Skript, mit dem ich es überprüft habe:

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
quelle
Ich möchte maximal 3 Stellen vor der Dezimalstelle, habe es ohne Glück versucht ^ ([0-9] {0,3}) + (\. [0-9] {1,2})? $
Raghurocks
3
@ Raghurocks Entfernen Sie die +nach dem ersten schließenden Paren,^([0-9]{0,3})(\.[0-9]{1,2})?$
dbr
Für Java-Benutzer: Die Dezimalstelle sollte nicht maskiert werden.
3
@Gracchus Bist du sicher? Es sollte wahrscheinlich \\.statt sein, \.weil .es so aussieht, als würde es funktionieren, aber mit jedem Zeichen übereinstimmt (nicht nur mit der Dezimalstelle). Zum Beispiel kann sowohl 1z23und 1.23könnte als gültig angesehen , wenn Sie es nicht entkommen
dbr
@dbr Vielleicht sollte es so sein. Java hat sich nur über unsachgemäße Flucht beschwert. Entfernen Sie das "reparierte es" (halt die Klappe), lol. Ich hatte noch keine Gelegenheit, es vollständig zu testen.
20

Um ein optionales Minuszeichen einzufügen und Zahlen wie 015(die mit Oktalzahlen verwechselt werden können) nicht zuzulassen, schreiben Sie:

-?(0|([1-9]\d*))(\.\d+)?
Karol Bienkowski
quelle
Dies erlaubt mir Alpha vor der Dezimalstelle. Erlaubt X.25
BengalTigger
1
Dies begrenzt die Anzahl der Dezimalstellen nicht auf 2.
Dawood ibn Kareem
13

Für Zahlen ohne Tausendertrennzeichen mag ich diesen einfachen, kompakten regulären Ausdruck:

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

oder, um nicht auf eine Genauigkeit von 2 beschränkt zu sein:

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

Letztere Streichhölzer
1
100
100
100,74
100,7
0,7
0,7
0,72

Und es stimmt nicht mit einer leeren Zeichenfolge überein (wie \ d *.? \ D * würde)

Jimmy
quelle
7

Ich benutze diese für bis zu zwei Dezimalstellen:
(^(\+|\-)(0|([1-9][0-9]*))(\.[0-9]{1,2})?$)|(^(0{0,1}|([1-9][0-9]*))(\.[0-9]{1,2})?$) passiert:
0,25
0,25
10,25
+0,25

nicht passieren:
± 25
01.25
1.
1,256

frustrierter Regex-Benutzer
quelle
Dies übergibt auch einen leeren Wert.
BengalTigger
7
^[0-9]+(\.([0-9]{1,2})?)?$

Wird Dinge wie 12.akzeptiert machen. Dies wird nicht allgemein akzeptiert, aber wenn Sie „flexibel“ sein müssen, ist dies ein Weg. Und natürlich [0-9]kann durch ersetzt werden \d, aber ich denke, es ist auf diese Weise besser lesbar.

BSharper
quelle
5

Versuche dies

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

Es werden auch positive und negative Vorzeichen zugelassen.

Android
quelle
3

Haupt Antwort ist falsch , weil es Valids 5.oder 5,Eingänge

Dieser Code behandelt es (aber in meinem Beispiel sind negative Zahlen verboten):

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

Ergebnisse sind unten:

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
quelle
2
preg_match("/^-?\d+[\.]?\d\d$/", $sum)
DEC32
quelle
2

Im Allgemeinen dh unbegrenzte Dezimalstellen:

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

SK9
quelle
1

Wird nicht müssen Sie das nehmen ein e666.76Rechnung?

Mit

(e|0-9)\d*\d.\d{1,2)
Raumschlüssel
quelle
Nein, das würde den Rahmen des Projekts sprengen! danke aber, es ist praktisch :)
user39221
1

Wenn ich auch meine Antwort hinzufüge, könnte jemand sie nützlich finden oder auch meine richtig sein.

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


alert(getInteger('-11.11'));
STAHL
quelle
1

Das hat bei mir funktioniert:

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

Gruppe 1 ist Ihre Float-Nummer und Gruppe 2 ist nur der Bruch.

Schattiger Sherif
quelle
1

Ich habe es mit meinem Projekt versucht. Dies ermöglicht auch Zahlen mit + | -Vorzeichen.

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

Chrome 56 akzeptiert diese Art von Mustern nicht (Chrome 56 erhält 11.11. Eine zusätzliche.) Mit Typennummer. Verwenden Sie Typ als Text als Fortschritt.

rajesh_kw
quelle
0

Dies ermöglicht eine Dezimalstelle mit Exponentiation und bis zu 2 Stellen.

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

Demo

Nambi_0915
quelle
Das passt weder zur ganzen Zahl noch1.2e-10
Toto
Ja, danke für deine Korrektur. Ich dachte, es ist nur für Dezimalzahlen
Nambi_0915
([0-9]+)?ist besser geschrieben \d*. Jetzt passt es nicht zusammen 10e3. Und OP möchte mit bis zu 2 Ziffern übereinstimmen.
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');
            }
    }

Die Funktion überprüft jede Dezimalzahl. Die Wetternummer hat Dezimalstellen oder nicht. Andernfalls wird "Richtige Nummer" angezeigt. "Bitte geben Sie nur Zahlen in das Textfeld" Betrag "ein. Warnmeldung wird angezeigt.

Vielen Dank... :)

Bhanu Pratap
quelle