O que é "o melhor" Moeda RegEx EUA?

votos
44

Uma busca rápida para regex moeda traz um monte de resultados .
MSDN usa ^ -? (. \ \ D {2})? \ D + $

O problema que tenho na escolha de um destes é que regex é difícil verificar sem testar todos os casos de ponta. Eu poderia gastar muito tempo sobre isso como estou certo que centenas de outros desenvolvedores já feito.

Então ... Alguém tem uma expressão regular para US moeda que tem sido exaustivamente testado ?

Minha única exigência é que o texto correspondente é de US Moeda e analisa a System.Decimal :

[Ws] [sinal] [dígitos,] dígitos [.fractional dígitos] [ws] 

Elementos em colchetes ([e]) são opcionais. 
A tabela seguinte descreve cada elemento. 

DESCRIÇÃO DO ELEMENTO
ws espaço em branco opcional.
assinar um sinal opcional.
dígitos Uma sequência de dígitos que variam de 0 a 9.
, Um símbolo separador de milhares específicas da cultura.
. Um símbolo de ponto decimal específicas da cultura.
Fracionado dígitos uma sequência de dígitos que variam de 0 a 9. 
Publicado 09/12/2008 em 21:05
fonte usuário
Em outras línguas...                            


11 respostas

votos
72

aqui estão algumas coisas dos fabricantes de Regex Buddy. Estes vieram a partir da biblioteca por isso estou confiante de que eles já foram testados.

Número: Montante na moeda (centavos obrigatórias) milhares opcionais separadores; fracção obrigatória de dois dígitos

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

Número: Montante na moeda (centavos opcional) milhares opcionais separadores; fracção opcional de dois dígitos

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

Número: quantidade de moeda EUA e da UE (opção de centavos) Pode usar US-style 123,456.78 notação e de estilo europeu 123.456,78 notação. separadores de milhares opcional; fracção opcional de dois 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})?)$
Respondeu 09/12/2008 em 21:57
fonte usuário

votos
12

Eu encontrei esta expressão regular na linha em www.RegExLib.com por Kirk Fuller, Gregg Durishan

Eu tenho usado com sucesso para os últimos dois anos.

"^\$?\-?([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}))\)$"
Respondeu 09/12/2008 em 22:20
fonte usuário

votos
6

Não exaustivamente testado em tudo (eu só escrevi isso!), Mas parece se comportar corretamente:

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

Conjunto de teste:

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: O System.Decimal é locale dependente, difícil de fazer em regex, exceto, talvez, quando construí-la. Presumi dígitos sendo agrupados por três, mesmo que em algumas culturas (locales) existem regras diferentes.
É trivial para adicionar espaço em branco em torno dele.

Respondeu 09/12/2008 em 22:52
fonte usuário

votos
2

A resposta de Keng é perfeito, eu só quero acrescentar que para trabalhar com 1 ou 2 casas decimais (para terceira versão):

"^[+-]?[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

Respondeu 15/12/2014 em 19:16
fonte usuário

votos
1

Esta questão está a poucos anos de idade, então eu queria dar uma resposta atualizado.

Eu usei jQuery InputMask e ele funciona muito bem para entrada / formato de mascaramento (como números de telefone, etc), mas não funciona realmente bem para a moeda da minha experiência.

Para moeda, eu recomendo fortemente autoNumeric jQuery plugin. É bem conservados e eles basicamente "pensamento de tudo" que eu poderia querer para a moeda.

I, na verdade utilizar uma combinação de ambos os encaixes para a formatação de números de telefone, formatos de número (ISBN, etc), bem como moedas (moeda dos EUA na maior parte).

Tenha em mente que jquery.inputmaské principalmente sobre como controlar o formato de um valor, enquanto autoNumericestá sobre especificamente controlar o formato de moeda.

Respondeu 12/06/2016 em 02:54
fonte usuário

votos
0

Usando resposta de Leandro I adicionado ^(?:[$]|)ao início para permitir um sinal 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})?)$

este combinado

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

Não combinou

11124.52
234223425.345
234.
.5234
a
a.23
32.a
a.a
z548,452.22
u66.36
Respondeu 29/06/2018 em 00:49
fonte usuário

votos
0

Isto é o que eu uso:

Sem levar + ou -

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

Com liderança + opcional ou -

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

fiddle net: https://jsfiddle.net/compsult/9of63cwk/12/

Respondeu 07/07/2016 em 21:41
fonte usuário

votos
0

No caso de você querer explicar o erro humano que você poderia fazer a moeda a regex mais indulgente quando a correspondência. Eu usei 2 bom regex de Keng e fez dele um pouco mais robusto para dar conta de erro de digitação do.

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

Isso irá corresponder a qualquer uma destas figuras moeda adequadas ou mutilados, mas não pegar o lixo extra no final após o espaço:

$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
Respondeu 05/01/2013 em 18:15
fonte usuário

votos
0

Eu tive sucesso com este (levando pedaços de alguns dos regexs acima). Só suporta até milhares, mas não deve ser muito difícil estender esse

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)
}
Respondeu 12/12/2012 em 18:35
fonte usuário

votos
0

Eu estou usando a seguinte expressão regular para validação de moeda:

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

Você também pode permitir opcional sinal de liderança de dólares:

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

Você pode facilmente adicionar testes para parênteses em vez de sinal, adicionando

\( and \)
Respondeu 29/11/2011 em 14:15
fonte usuário

votos
0

Eu estava olhando para isso também e chegaram à conclusão de que é melhor para construir a regex com base na cultura atual. Podemos usar o

CurrencyPositivePattern 
CurrencyGroupSeparator
CurrencyDecimalSeparator

Propriedades de NumberFormatInfoobter o formato exigido.

Edit: algo como isto

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 : ""); 

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

Respondeu 25/08/2011 em 07:57
fonte usuário

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