2010-02-09 27 views
19

Por favor ayuda conmigo escribiendo Validación de JavaScript para moneda/campo monetario.Validación de moneda

Así que por favor proporcione cualquier expresiones regulares si tienes :)

Además, para mi región, no necesitan ningún símbolos de moneda como '$' en el campo.

Solo se incluirán los decimales para la validación como los caracteres especiales., Junto con los números.

+0

es la parte que sigue punto decimal opcional? es '103.5' válido, o debería ser' 103.50'? – Amarghosh

+0

parte después del decimal es opcional. – dev646

Respuesta

32

Se podría utilizar una expresión regular:

var regex = /^\d+(?:\.\d{0,2})$/; 
var numStr = "123.20"; 
if (regex.test(numStr)) 
    alert("Number is valid"); 

Si usted no está buscando ser tan estricto con las cifras decimales Puede que le resulte más fácil utilizar el unario (+) del operador para echar a un número para verificar su validez:

var numStr = "123.20"; 
var numNum = +numStr; // gives 123.20 

Si la cadena de números no es válida, volverá NaN (No un número), algo que se puede comprobar fácilmente para:

var numStr = "ab123c"; 
var numNum = +numStr; 
if (isNaN(numNum)) 
    alert("numNum is not a number"); 

Será, por supuesto, permitir a un usuario añadir más decimales, pero se puede cortar cualquier descuento usando number.toFixed(2) para redondear a 2 decimales. parseFloat es mucho menos estricto con la entrada y arrancará el primer número que pueda encontrar de una cadena, siempre que esa cadena comience con un número, por ej. parseFloat("123abc") rendiría 123.

+1

guau ... me siento mejor ahora ... eso estuvo bien ... ¡Gracias! – dev646

+3

regex utilizado para probar la validez de la cadena no acepta comas. Utilice /^[1-9]\d*(((,\d{3}){1})?(\.\d{0,2})?)$/ en su lugar. – Redtopia

1
/[1-9]\d*(?:\.\d{0,2})?/ 

[1-9] - must start with 1 to 9 
\d* - any number of other digits 
(?:)? - non capturing optional group 
\. - a decimal point 
\d{0,2} - 0 to 2 digits 

funciona para usted? o tal vez parseFloat:

var float = parseFloat(input); 
+2

No creo que 'parseFloat' o' parseInt' sean tan buenos para la validación, sino que analizarán cadenas como "123abc" como "123". Además, sus pruebas de expresiones regulares son verdaderas en la siguiente cadena: '" a01.9bc "', debe agregar '^' y '$' para que coincidan con el principio y el final de la cadena, respectivamente. De hecho, incluso una cadena como "0,91" no funcionará. –

+0

Sí, tienes razón, Andy E ha proporcionado una mejor respuesta – meouw

25

Creé mi respuesta a partir de la respuesta aceptada.

var regex = /^[1-9]\d*(((,\d{3}){1})?(\.\d{0,2})?)$/;

^[1-9] El número debe comenzar con 1-9
\d* El número puede tener cualquier número de cualquier dígito
(...)$ vistazo al siguiente grupo desde el extremo (...)$
(...)?(...)? buscar dos grupos opcionalmente El primero es para la coma, el segundo es para el decimal.
(,\d{3}){1} Busque una ocurrencia de una coma seguida de exactamente tres dígitos
\.\d{0,2} Busque un decimal seguido de cero, uno o dos dígitos.

Esta expresión regular trabaja fuera de estas reglas:

  • valores válidos son números 0-9, coma y el punto decimal.
  • Si un cliente ingresa más de un punto decimal o más de una coma, el valor no es válido y no será aceptado.

  • Ejemplos de entrada no válida valores

    • 1.2.3
    • 1,2,4
  • Ejemplos de entrada válida valores
    • 1,23
    • 1.000
    • 3967.
    • 1,2
    • 999,999.99

Un ejemplo se puede ver aquí: http://jsfiddle.net/rat141312/Jpxu6/1/

ACTUALIZACIÓN

cambiando el [1-9] en la expresión regular a [0-9] cualquier número menos de 1 también se puede validar. Ejemplo: 0.42, 007

+0

¡Práctico! Combinado con la respuesta aceptada, esta resultó ser una buena solución a un problema que estaba teniendo. –

+2

... excepto que no permite números menores a 1.00. –

+2

Andy, vio su comentario tarde. Tiene razón :(no se permiten valores inferiores a 1. Al cambiar el 1-9 al 0-9 funcionará. – Sababado

0

Para mí su fina de trabajo para la moneda india en INR

var regex = /^[1-9]{0,2}(,{0,1})(\d{2},)*(\d{3})*(?:\.\d{0,2})$/; 
var a = '1,111.11'; 
regex.test(a);