2012-01-12 13 views
13

Sé que esto se ha hecho miles de veces pero tengo problemas para hacerlo bien. Necesito formatear el valor de una entrada de texto para cantidades en dólares. No se deben permitir comas. Solo se deben permitir dos decimales. ejemplos de lo que debería ser permitido:Expresión regular por cantidad de dólares en JavaScript

  • 100,10
  • $ 100
  • $ 100,25

abajo es mi actual expresión regular incompleta. Actualmente permite que se incluyan varios signos de dólar en cualquier lugar (no solo al principio), múltiples puntos decimales para incluir en cualquier lugar y más de dos decimales que no deberían incluirse.

<head> 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript" language="Javascript"> 
    $(function(){ 

     jQuery('.dollarAmountOnly').keyup(function() { 
      this.value = this.value.replace(/[^$0-9\.]/g, ''); 
     }); 
    }); 
</script> 
</head> 
<body> 
<input type="text" class="dollarAmountOnly"/> 
</body> 
</html> 

Les agradecería mucho la ayuda. ¡Gracias!

Respuesta

27

EDITAR

Lo sentimos, su pregunta claramente pidió exactamente dos cifras decimales. Esto es lo que quiere:

var r = /^\$?[0-9]+(\.[0-9][0-9])?$/; 

console.log(r.test("12.55")); //true 
console.log(r.test("$12.55")); //true 
console.log(r.test("$12"));  //true 

console.log(r.test("$12.")); //false 
console.log(r.test("$12.2")); //false 
console.log(r.test("$$12"));  //false 
console.log(r.test("$12.555")); //false 

Tienes que escapar de su signo del dólar, entonces usted quiere dos dígitos opción después de la coma decimal:

var r = /^\$?[0-9]+\.?[0-9]?[0-9]?$/; 

console.log(r.test("12.55")); //true 
console.log(r.test("$12.55")); //true 
console.log(r.test("$12.")); //true 
console.log(r.test("$12"));  //true 

console.log(r.test("$$12"));  //false 
console.log(r.test("$12.555")); //false 

Fiddle

O, para permitir dígitos arbitrarios después del punto decimal, puede usar un cierre de Kleene en lugar de dos dígitos opcionales

var r = /^\$?[0-9]+\.?[0-9]*$/; 

console.log(r.test("12.55")); //true 
console.log(r.test("$12.55")); //true 
console.log(r.test("$12.")); //true 
console.log(r.test("$12"));  //true 
console.log(r.test("$12.555")); //true 

console.log(r.test("$$12"));  //false 
+0

Gracias por la respuesta. Probé tu expresión regular pero todavía permite múltiples signos de dólar. – SquidScareMe

+0

@SquidScareMe - ¿estás seguro? Dos signos de dólar fallan para mí –

+0

@AdamRackis el asker tampoco quiere $ requerido, pero hasta uno {0.1} permitido funcionaría, ¿no? – Jordan

3

Recomiendo hacer la validación no en .keyup (es decir, como el usuario escribe), pero cuando el usuario envía el formulario.

Luego, en lugar de reemplazar los caracteres no válidos, puede verificar que el cuadro de texto dollarAmountOnly coincida con la expresión regular correcta.

una expresión regular para el precio válido es (esto permite que se arrastra/espacios iniciales):

/^ *\$?\d+(?:\.\d{2})? *$/g 

Así que cuando el usuario presiona someten, a ver si la expresión coincide con dollarAmountOnly, y si no, que el usuario sepa de alguna manera .

+0

Gracias por la respuesta. Lamentablemente, el requisito es validar a medida que el usuario escribe. – SquidScareMe

+0

Si le interesa, hay un estudio sobre A List Apart que incluye [cuándo validar cuando se realiza la validación en línea] (http://alistapart.com/article/inline-validation-in-web-forms#section4). Decir "no lo hagas en la tecla" es una simplificación excesiva. Consideraron que lo mejor era hacerlo en la tecla después de un breve retraso. – user2449231

8

Para aquellos de nosotros que quieren permitir una coma, aquí es la expresión regular para que:

/^\$?\d+(,\d{3})*\.?[0-9]?[0-9]?$/ 

Abogo lo que le permite y la eliminación de las comas en el backend si no lo hace realmente desea. Cualquier cosa para que sea más fácil para el usuario.Jakob Nielson discusses cumbersome forms at point #7.

+2

Mejora leve, esto permite decimales, pero requiere que existan dos lugares después del período, si se ingresa un punto: '/^\$?\d+(,\d{3})*(\.[0-9 ] {2})? $/'Es una combinación de la tuya y otra que he estado usando por un tiempo que también encontré en algún lugar en Stack Overflow, creo. – trevorhinesley

+0

@ user2449231 ¡este es genial! ¿Podrías publicar esto con la adición de permitir una coma? – BenRacicot

0

Aquí es una expresión regular i utilizado para identificar diversas monedas en javascript:

_this.currencyRegex = /^(\$|\€\£|\₪|)(?!0\.00)\d{1,3}(,\d{3})*(\.\d\d)?$/; 

y una buena herramienta para la depuración:

https://regex101.com/r/hL2pF2/26

Cuestiones relacionadas