¿Cuál es el "mejor" registro de divisas de los EE. UU.?

votos
44

Una búsqueda rápida de expresiones regulares de divisas trae muchos resultados .
MSDN usa ^ -? \ D + (\. \ D {2})? $

El problema que tengo al elegir uno de estos es que Regex es difícil de verificar sin probar todos los casos extremos. Podría dedicar mucho tiempo a esto, ya que estoy seguro de que otros cientos de desarrolladores ya lo hicieron.

Entonces ... ¿Alguien tiene una expresión regular para moneda estadounidense que haya sido probada exhaustivamente ?

Mi único requisito es que la cadena coincidente sea la moneda de los EE. UU. Y analice System.Decimal :

[ws] [signo] [dígitos,] dígitos [.finales -fácticos] [ws] 

Los elementos entre corchetes ([y]) son opcionales. 
La siguiente tabla describe cada elemento. 

ELEMENTO DESCRIPCIÓN
ws Espacio en blanco opcional.
firmar un signo opcional.
dígitos Una secuencia de dígitos que va de 0 a 9.
, Un símbolo separador de miles específico de cultura.
. Un símbolo de punto decimal específico para cada cultura.
dígitos fraccionarios Una secuencia de dígitos que van de 0 a 9. 
Publicado el 09/12/2008 a las 21:05
fuente por usuario
En otros idiomas...                            


11 respuestas

votos
72

Aquí hay algunas cosas de los creadores de Regex Buddy. Estos vinieron de la biblioteca, así que estoy seguro de que han sido probados a fondo.

Número: Monto de moneda (centavos obligatorios) Separadores de miles opcionales; fracción obligatoria de dos dígitos

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:,?[0-9]{3})*\.[0-9]{2}$

Número: Monto de moneda (centavos opcionales) Separadores de miles opcionales; fracción opcional de dos dígitos

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{2})?$

Número: Monto en moneda US y EU (centavos opcionales) Puede usar la notación 123.456.78 al estilo estadounidense y la anotación 123.456,78 al estilo europeo. Separadores de miles opcionales; fracción opcional de dos dígitos

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{2})?|(?:,[0-9]{3})*(?:\.[0-9]{2})?|(?:\.[0-9]{3})*(?:,[0-9]{2})?)$
Respondida el 09/12/2008 a las 21:57
fuente por usuario

votos
12

Encontré esta expresión regular en línea en www.RegExLib.com por Kirk Fuller, Gregg Durishan

Lo he estado usando con éxito durante los últimos años.

"^\$?\-?([1-9]{1}[0-9]{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))$|^\-?\$?([1-9]{1}\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))$|^\(\$?([1-9]{1}\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))\)$"
Respondida el 09/12/2008 a las 22:20
fuente por usuario

votos
6

No se ha probado del todo (¡lo acabo de escribir!), Pero parece que se comporta correctamente:

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

Equipo de prueba:

0
1
33
555
4,656
4656
99,785
125,944
7,994,169
7994169
0.00
1.0
33.78795
555.12
4,656.489
99,785.01
125,944.100
-7,994,169
-7994169.23 // Borderline...

Wrong:
000
01
3,3
5.
555,
,656
99,78,5
1,25,944
--7,994,169
0.0,0
.10
33.787,95
4.656.489
99.785,01
1-125,944.1
-7,994E169

Nota: Su System.Decimal depende de la configuración regional, es difícil de crear en expresiones regulares, excepto tal vez al compilarlo. Supuse que los dígitos estaban agrupados por tres, incluso si en algunas culturas (locales) existen diferentes reglas.
Es trivial agregar espacios en blanco a su alrededor.

Respondida el 09/12/2008 a las 22:52
fuente por usuario

votos
2

La respuesta de Keng es perfecto, sólo quiero añadir que para trabajar con 1 o 2 decimales (por tercera versión):

"^[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{1})?|(?:,[0-9]{3})*(?:\.[0-9]{1,2})?|(?:\.[0-9]{3})*(?:,[0-9]{1,2})?)$

FIDDLE NET: https://dotnetfiddle.net/1mUpX2

Respondida el 15/12/2014 a las 19:16
fuente por usuario

votos
1

Esta pregunta se hace un par de años, así que quería dar una respuesta actualizada.

He utilizado jQuery MáscaraDeEntrada y funciona muy bien para la entrada / formato de enmascaramiento (como números de teléfono, etc.), pero que en realidad no funciona bien para la moneda de mi experiencia.

Para la moneda, recomiendo fuertemente Autonumérico plugin de jQuery. Está bien mantenido y han básicamente "pensamiento de todo" lo que pueda desear para la moneda.

En realidad yo uso una combinación de estos dos plugins para dar formato a los números de teléfono, los formatos de número (ISBN, etc.), así como monedas (moneda de Estados Unidos sobre todo).

Tenga en cuenta que jquery.inputmaskse trata principalmente de controlar el formato de un valor, mientras que autoNumerices el control sobre el formato concreto de la moneda.

Respondida el 11/06/2016 a las 23:54
fuente por usuario

votos
0

Utilizar el servicio de Leandro añadí ^(?:[$]|)al principio para permitir un signo de dólar precedente

^(?:[$]|)[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{1})?|(?:,[0-9]{3})*(?:\.[0-9]{1,2})?|(?:\.[0-9]{3})*(?:,[0-9]{1,2})?)$

este emparejado

136,402.99
25.27
0.33
$584.56
1
00.2
3,254,546.00
$3,254,546.00
00.01
-0.25
+0.85
+100,052.00

No emparejaron

11124.52
234223425.345
234.
.5234
a
a.23
32.a
a.a
z548,452.22
u66.36
Respondida el 29/06/2018 a las 00:49
fuente por usuario

votos
0

Esto es lo que yo uso:

Sin conducir + o -

^\$\d{1,3}\.[0-9]{2}$|^\$(\d{1,3},)+\d{3}\.[0-9]{2}$

Con líder + o - opcional

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

violín neta: https://jsfiddle.net/compsult/9of63cwk/12/

Respondida el 07/07/2016 a las 18:41
fuente por usuario

votos
0

En caso de que quiera dar cuenta de los errores humanos que podría hacer la moneda la expresión regular más tolerantes al emparejar. Solía ​​segundo bonita expresión regular de Keng y lo hizo un poco más robusta para dar cuenta de errata.

\$\ ?[+-]?[0-9]{1,3}(?:,?[0-9])*(?:\.[0-9]{1,2})?

Esto coincidirá con cualquiera de estas cifras monetarias adecuadas o destrozados, pero no recoger la basura extra en el final después de que el espacio:

$46,48382
$4,648,382
$ 4,648,382
$4,648,382.20
$4,648,382.2
$4,6483,82.20
$46,48382 70.25PD
$ 46,48382 70.25PD
Respondida el 05/01/2013 a las 18:15
fuente por usuario

votos
0

He tenido éxito con esto (tomar pedazos de algunos de los regexs arriba). Sólo maneja hasta miles, pero no debería ser demasiado difícil de extender ese

case class CurrencyValue(dollars:Int,cents:Int)
def cents = """[\.\,]""".r ~> """\d{0,2}""".r ^^ {
  _.toInt
}
def dollarAmount: Parser[Int] = """[1-9]{1}[0-9]{0,2}""".r ~ opt( """[\.\,]""".r ~> """\d{3}""".r) ^^ {
  case x ~ Some(y) => x.toInt * 1000 + y.toInt
  case x ~ None => x.toInt
}
def usCurrencyParser = """(\$\s*)?""".r ~> dollarAmount ~ opt(cents) <~ opt( """(?i)dollars?""".r) ^^ {
  case d ~ Some(change) => CurrencyValue(d, change)
  case d ~ None => CurrencyValue(d, 0)
}
Respondida el 12/12/2012 a las 18:35
fuente por usuario

votos
0

Estoy usando la siguiente expresión regular para la validación de la moneda:

^-?0*(?:\d+(?!,)(?:\.\d{1,2})?|(?:\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?))$

También puede permitir el signo del dólar líder opcional:

^\$?-?0*(?:\d+(?!,)(?:\.\d{1,2})?|(?:\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?))$

Usted puede agregar fácilmente las pruebas de paréntesis en lugar de la señal mediante la adición

\( and \)
Respondida el 29/11/2011 a las 14:15
fuente por usuario

votos
0

Estaba buscando en esto también y han llegado a la conclusión de que lo mejor es construir la expresión regular basado en la cultura actual. Podemos utilizar el

CurrencyPositivePattern 
CurrencyGroupSeparator
CurrencyDecimalSeparator

propiedades de NumberFormatInfopara obtener el formato requerido.

Editar: algo como esto

NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
      // Assign needed property values to variables.
      string currencySymbol = nfi.CurrencySymbol;
      bool symbolPrecedesIfPositive = nfi.CurrencyPositivePattern % 2 == 0;
      string groupSeparator = nfi.CurrencyGroupSeparator;
      string decimalSeparator = nfi.CurrencyDecimalSeparator;

      // Form regular expression pattern.
      string pattern = Regex.Escape( symbolPrecedesIfPositive ? currencySymbol : "") + 
                       @"\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" + 
                       Regex.Escape(decimalSeparator) + "[0-9]+)?)" + 
                       (! symbolPrecedesIfPositive ? currencySymbol : ""); 

consulte - http://msdn.microsoft.com/en-us/library/hs600312.aspx

Respondida el 25/08/2011 a las 07:57
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more