regular - regex test
¿Cuál es el "mejor" registro de divisas de los EE. UU.? (11)
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})?)$
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][sign][digits,]digits[.fractional-digits][ws] Elements in square brackets ([ and ]) are optional. The following table describes each element. ELEMENT DESCRIPTION ws Optional white space. sign An optional sign. digits A sequence of digits ranging from 0 to 9. , A culture-specific thousands separator symbol. . A culture-specific decimal point symbol. fractional-digits A sequence of digits ranging from 0 to 9.
En caso de que desee contabilizar un error humano, podría hacer que la expresión regular sea más indulgente al hacer coincidir la moneda. Utilicé la segunda expresión regular de Keng y la hice un poco más robusta para dar cuenta de los errores tipográficos.
/$/ ?[+-]?[0-9]{1,3}(?:,?[0-9])*(?:/.[0-9]{1,2})?
Esto coincidirá con cualquiera de estas cifras monetarias correctas o arruinadas, pero no recogerá la basura adicional al final después del 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
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}))/)$"
Esta pregunta tiene algunos años, así que quería dar una respuesta actualizada.
He usado jQuery InputMask y funciona muy bien para enmascaramiento de entrada / formato (como números de teléfono, etc.) pero realmente no funciona bien para moneda según mi experiencia.
Para la moneda, recomiendo el plugin jQuery autoNumeric . Está bien mantenido y básicamente han "pensado en todo" lo que podría desear para la divisa.
De hecho, uso una combinación de estos dos complementos para formatear números de teléfono, formatos de números (ISBN, etc.), así como monedas (principalmente, moneda estadounidense).
Tenga en cuenta que jquery.inputmask
trata principalmente de controlar el formato de un valor, mientras que autoNumeric
trata de controlar específicamente el formato de la moneda.
Estaba mirando esto también y he llegado a la conclusión de que es mejor construir la expresión regular en función de la cultura actual. Podemos usar el
CurrencyPositivePattern
CurrencyGroupSeparator
CurrencyDecimalSeparator
propiedades de NumberFormatInfo
para 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
Esto es lo que uso:
Sin liderar + o -
^/$/d{1,3}/.[0-9]{2}$|^/$(/d{1,3},)+/d{3}/.[0-9]{2}$
Con lead + o - opcional
^[+-]?/$/d{1,3}/.[0-9]{2}$|^[+-]?/$(/d{1,3},)+/d{3}/.[0-9]{2}$
violín neto: https://jsfiddle.net/compsult/9of63cwk/12/
Estoy usando la siguiente expresión regular para la validación de moneda:
^-?0*(?:/d+(?!,)(?:/./d{1,2})?|(?:/d{1,3}(?:,/d{3})*(?:/./d{1,2})?))$
También puede permitir el signo de dólar principal opcional:
^/$?-?0*(?:/d+(?!,)(?:/./d{1,2})?|(?:/d{1,3}(?:,/d{3})*(?:/./d{1,2})?))$
Puede agregar fácilmente pruebas para paréntesis en lugar de firmar agregando
/( and /)
He tenido éxito con esto (tomando partes y piezas de algunas de las expresiones regulares anteriores). Solo maneja hasta miles, pero no debería ser demasiado difícil de extender
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)
}
La respuesta de Keng es perfecta, solo quiero agregar eso para trabajar con 1 o 2 decimales (para la 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})?)$
NET FIDDLE: https://dotnetfiddle.net/1mUpX2
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.
Utilizando la respuesta de Leandro agregué ^(?:[$]|)
principio para permitir un signo de dólar anterior
^(?:[$]|)[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{1})?|(?:,[0-9]{3})*(?:/.[0-9]{1,2})?|(?:/.[0-9]{3})*(?:,[0-9]{1,2})?)$
Esto 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