2009-03-19 43 views
8

Estoy buscando una expresión regular que coincida con valores numéricos con un número de decimales definido por el usuario. Actualmente tengoRegex que coincide con el número con hasta 2 decimales

/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/ 

que permitirá a tantos lugares como entrada, pero también me gustaría para permitir veces 2 de moneda o 4 o más para otra entrada. La función que estoy construyendo es

var isNumeric = function(val, decimals) { 
    // decimals is not used yet 
    var objRegExp = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/; 
    return objRegExp.test(val); 
}; 

Respuesta

4

intentar algo como esto:

^\d+\.\d{0,3}$

donde "3" es el máximo cifras decimales permitidos.

+0

[Según MDN] (https://developer.mozilla.org/ en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp # cuantifiers), el cuantificador 'x {n, m}' requiere que "n y m sean ** enteros positivos **" - es decir, 0 no es un límite inferior válido. [Pero la especificación dice] (https://www.ecma-international.org/ecma-262/5.1/#sec-15.10.1) que el tipo de 'n' y' m' es 'DecimalDigits', entonces 0 esta permitido.MDN está equivocado aquí: su expresión cumple con las especificaciones y es segura de usar en cualquier navegador. – hashchange

17
/^\s*-?[1-9]\d*(\.\d{1,2})?\s*$/ 

Es bueno perdonar los espacios en blanco (s). Lo anterior no permite comenzar con cero. Si desea permitir eso:

/^\s*-?\d+(\.\d{1,2})?\s*$/ 

Ninguno de los anteriores permite un número decimal con nada antes de la posición decimal. Si desea permitir eso:

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

¿Tiene una variación que permite un '.' posterior sin ningún dígito después de él? JavaScript considera esto un número válido, siempre que no haya _dos puntos finales ('isNaN (1.) // falso') –

1

Esto debe coincidir con los números enteros y decimales hasta con dos decimales.

/\A[+-]?\d+(?:\.\d{1,2})?\z/ 

NOTA: Cambiar el "2" en "{1,2}" a cualquier número de cifras decimales que desea apoyar.

Sé que esto no forma parte de su pregunta, pero puede hacerlo sin una expresión regular también. Esto es una solución:

var isNumeric = function(val, decimals) { 
    if (parseFloat(val)) { 
     var numeric_string = val + ''; 
     var parts = numeric_string.split('.', 1); 
     if (parts[1] && parts[1].length > decimals) { 
      alert('too many decimal places'); 
     } 
     else { 
      alert('this works'); 
     } 
    } 
    else { 
     alert('not a float'); 
    } 
} 
+0

No se pudo hacer coincidir en enteros o decimales con uno o dos lugares con la siguiente sintaxis: var regex = new Regex ("/ \\ A [+ -]? \\ d + (?: \\. \\ d {1,2})? \\ z /"); if (regex.IsMatch ("1234")) { –

3

Soy un chico de C# por el comercio, pero encuentro herramientas como The Regulator para C# o RegexPal a ser extremadamente útil cuando se trata de ajustar Regex que sea "tan".

3

Gracias a todos. Usé un poco de todas las respuestas.

var isNumeric = function(val, decimalPlaces) { 
    // If the last digit is a . then add a 0 before testing so if they type 25. it will be accepted 
    var lastChar = val.substring(val.length - 1); 
    if (lastChar == ".") val = val + "0"; 

    var objRegExp = new RegExp("^\\s*-?(\\d+(\\.\\d{1," + decimalPlaces + "})?|\\.\\d{1," + decimalPlaces + "})\\s*$", "g"); 
    if (decimalPlaces == -1) 
     objRegExp = new RegExp("^\\s*-?(\\d+(\\.\\d{1,25})?|\\.\\d{1,25})\\s*$", "g"); 

    return objRegExp.test(val);   
}; 
3

Sumando 0 si el último dígito es un "." no cubre el caso de espacios en blanco después del punto.

Creo que esto cubre todos los casos, pero querrás probarlo con más rigor que el que tengo aquí.

var isNumeric = function(val, decimals) { 
    if (decimals <= 0) { 
     var re = /^\s*\d+\.?\s*$/; 
     return re.test(val); 
    } else { 
     var reString = "^\\s*((\\d+(\\.\\d{0," + decimals + "})?)|((\\d*(\\.\\d{1," + decimals + "}))))\\s*$" 
     var re = new RegExp(reString); 
     return re.test(val); 
    } 
}; 

var test = function(val, decimals) { 
    document.write("isNumeric(" + val + ", " + decimals + ") = " + isNumeric(val, decimals) + "<br/>"); 
} 

test("123", 0); 
test("123", 5); 
test(" 123.45", 2); 
test(" 123.45", 3); 
test(" 123.45", 1); 
test(" ", 0); 
test(" ", 5); 
test(" 3.", 0); 
test(" 3.", 12); 
test(" .", 3); 
test(" .321 ", 5); 
-1

Prueba esta expresión regular, que funciona bien para mí:

^\d+\.\d{0,2}$ 
0

Use este patrón:

[0-9]?[0-9]?(\.[0-9][0-9]?)? 
Cuestiones relacionadas