Expresión regular simple para un decimal con una precisión de 2


271

¿Cuál es la expresión regular para un decimal con una precisión de 2?

Ejemplos válidos :

123.12
2
56754
92929292929292.12
0.21
3.1

Ejemplos inválidos:

12.1232
2.23332
e666.76

El punto decimal puede ser opcional y también se pueden incluir enteros.


1
Relacionado: para decimal con separador milésimo, consulte stackoverflow.com/questions/16148034/…
Yeo

1
La mejor respuesta está aquí: stackoverflow.com/a/39399503/715269
Gangnus

Respuestas:


398

Los tokens regex válidos varían según la implementación. Una forma genérica es:

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

Mas Compacto:

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

Ambos suponen que ambos tienen al menos un dígito antes y uno después del decimal.

Para requerir que toda la cadena sea un número de esta forma, ajuste la expresión en etiquetas de inicio y fin, como (en la forma de Perl):

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

Para hacer coincidir los números sin un dígito .12inicial antes del decimal ( ) y los números enteros que tienen un punto final ( 12.) mientras excluye la entrada de un solo punto ( .), intente lo siguiente:

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

Adicional

Envuelto la porción fraccional ()?para hacerlo opcional. Tenga en cuenta que esto excluye formas como 12. Incluir que serían más similares ^\d+\\.?\d{0,2}$.

Adicional

Úselo ^\d{1,6}(\.\d{1,2})?$para detener la repetición y restringir toda la parte del valor decimal.


44
Matemáticamente, creo que un número de precisión 2 siempre debe tener dos decimales, incluso si el último es cero. Esto se basa en mi experiencia con cifras significativas, por lo que podría estar equivocado, pero en realidad no sabes si 1.7 es 1.70 o cualquier número entre 1.70 y 1.74.
paxdiablo

¡Gracias! Era exactamente lo que necesitaba :) +1
alex

66
esto coincide con 0001.00: /
redben

2
Adicional '-?' en este ^ \ d + (\. \ d {1,2})? $ ===> ^ -? \ d + (\. \ d {1,2})? $ para apoyar -ve
Murali Murugesan

1
@BimalDas, puede admitir negativos al prefijar la expresión con -?, como en -?\d+(\.\d{1,2})?. No incluí negativos ni comencé con un punto decimal, ya que no estaban en la pregunta del OP, aunque ciertamente son válidos para un formato de número más genérico. El hilo de comentarios aquí da algunas formas de manejar ".21".
DocMax

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

Y dado que las expresiones regulares son horribles de leer, mucho menos entender, aquí está el equivalente detallado:

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

Puede reemplazar [0-9]con la \dmayoría de las implementaciones de expresiones regulares (incluidas PCRE , el más común). Lo dejé como [0-9]creo que es más fácil de leer.

Además, aquí está el script simple de Python que utilicé para verificarlo:

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

Quiero un máximo de 3 dígitos antes del decimal, intenté así sin suerte ^ ([0-9] {0,3}) + (\. [0-9] {1,2})? $
Raghurocks

3
@Raghurocks Retire el +después del primer par de cierre,^([0-9]{0,3})(\.[0-9]{1,2})?$
dbr

Para usuarios de Java: no se debe escapar el decimal.

3
@Gracchus ¿Estás seguro? Probablemente debería ser en \\.lugar de \.porque .parecerá que funciona, pero coincide con cualquier carácter (no solo el lugar decimal). Por ejemplo, ambos 1z23y 1.23podrían considerarse válidos si no se escapa
dbr

@dbr Quizás eso sea lo que debería ser. Java solo se quejó de un escape inadecuado. Quitar ese "lo arregló" (cállate), jajaja. Todavía no he tenido la oportunidad de probarlo por completo.

20

Para incluir un signo menos opcional y no permitir números como 015(que pueden confundirse con números octales) escriba:

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

Esto está permitiendo alfa antes del decimal para mí. Permite X.25
BengalTigger

1
Esto no limita el número de decimales a 2.
Dawood ibn Kareem

13

Para los números que no tienen un separador de miles, me gusta esta expresión regular simple y compacta:

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

o, para no limitarse a una precisión de 2:

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

Este último coincide con
1
100
100.
100.74
100.7
0.7
.7
.72

Y no coincide con una cadena vacía (como \ d *.? \ D * would)



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

Hará cosas como 12.aceptadas. Esto no es lo que comúnmente se acepta, pero si necesita ser "flexible", ese es un camino a seguir. Y, por supuesto, [0-9]se puede reemplazar con \d, pero supongo que es más legible de esta manera.


5

Prueba esto

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

Permitirá signos positivos y negativos también.


3

La respuesta principal es INCORRECTA porque es válida 5.o5, entradas

este código lo maneja (pero en mi ejemplo los números negativos están prohibidos):

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

los resultados son abajo:

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

En general, es decir, decimales ilimitados:

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


1

¿No necesitarás tener een e666.76cuenta?

Con

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

No, eso estaría fuera del alcance del proyecto. gracias sin embargo, es útil :)
user39221

1

agregando mi respuesta también, alguien puede encontrarla útil o puede ser correcta la mía también.

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


alert(getInteger('-11.11'));

1

Esto funcionó conmigo:

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

El grupo 1 es su número flotante y el grupo 2 es solo la fracción.


1

Intenté uno con mi proyecto. Esto permite números con + | -signos también.

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

0

Chrome 56 no acepta este tipo de patrones (Chrome 56 está aceptando 11.11. Un adicional) con el número de tipo, use el tipo como texto como progreso.


0

Esto permitirá decimales con exponenciación y hasta 2 dígitos,

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

Manifestación


Eso no coincide con el entero ni1.2e-10
Toto

Sí, gracias por tu corrección. Pensé que era solo para números decimales
Nambi_0915

([0-9]+)?Está mejor escrito \d*. Ahora no coincide 10e3. Y OP quiere hacer coincidir hasta 2 dígitos.
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');
            }
    }

la función validará cualquier número decimal, el número de clima tiene decimales o no, dirá "Número correcto" de otra manera "Por favor ingrese solo números en el cuadro de texto de cantidad". aparecerá un mensaje de alerta.

Gracias... :)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.