Что такое «The Best» валюты США RegEx?

голоса
44

Быстрый поиск валюты регулярного выражения вызывает много результатов .
MSDN использует ^ - (. \ \ D {2})? \ D + $

У меня есть проблема в выборе одного из них является то, что регулярное выражение трудно проверить, не испытав все крайние случаи. Я мог бы потратить много времени на это, как я уверен, что сотни других разработчиков уже сделали.

Так что ... Кто - нибудь есть регулярное выражение для американской валюты , которая была тщательно проверена ?

Мое единственное требование заключается в том , что соответствует строке американской валюты и разбирает в System.Decimal :

[WS] [знак] [цифра,] цифра [.fractional цифр] [WS] 

Элементы в квадратных скобках ([и]) не являются обязательными. 
Следующая таблица описывает каждый элемент. 

ЭЛЕМЕНТ ОПИСАНИЕ
WS Дополнительное белое пространство.
подписать дополнительный знак.
числа от А последовательность цифр от 0 до 9.
, Культура конкретного символа разделителя тысяч.
, Символ десятичной точки культуры конкретная.
дробная цифра последовательности цифр от 0 до 9. 
Задан 09/12/2008 в 21:05
источник пользователем
На других языках...                            


11 ответов

голоса
72

вот некоторые вещи от создателей Regex Бадди. Они пришли из библиотеки, поэтому я уверен, что они были тщательно протестированы.

Количество: Валюта Сумма (центы обязательные) Необязательный Без_разделитель; обязательная двузначное фракция

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

Количество: Валюта Сумма (центы дополнительно) Дополнительный Без_разделитель; опционально двузначное фракция

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

Количество: количество валюты США и ЕС (центы дополнительно) Можно использовать в американском стиле 123,456.78 обозначения и европейский стиль 123.456,78 обозначения. Необязательный Без_разделитель; опционально двузначное фракция

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{2})?|(?:,[0-9]{3})*(?:\.[0-9]{2})?|(?:\.[0-9]{3})*(?:,[0-9]{2})?)$
Ответил 09/12/2008 в 21:57
источник пользователем

голоса
12

Я нашел это регулярное выражение на линии в www.RegExLib.com Кирк Фуллер, Gregg Durishan

Я использую его успешно в течение последних нескольких лет.

"^\$?\-?([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}))\)$"
Ответил 09/12/2008 в 22:20
источник пользователем

голоса
6

Не тщательно протестирована на всех (я только что написал это!), Но, кажется, правильно вести себя:

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

Тест набор:

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

Примечание: Ваш System.Decimal локали зависит, трудно сделать в регулярном выражении, за исключением , возможно , при его построении. Я предположил , цифры группируются по три, даже если в некоторых культурах (локали) существует разные правила.
Это тривиально , чтобы добавить пустое пространство вокруг него.

Ответил 09/12/2008 в 22:52
источник пользователем

голоса
2

Ответ Кенг идеально, я просто хочу добавить, что для работы с 1 или 2-х знаков после запятой (для третьей версии):

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

Ответил 15/12/2014 в 19:16
источник пользователем

голоса
1

Этот вопрос несколько лет, так что я хотел бы дать обновленный ответ.

Я использовал JQuery InputMask , и она работает очень хорошо для ввода / формата маскирование (например, номера телефонов и т.д.) , но это не очень хорошо работает для валюты из моего опыта.

Для валюты, я настоятельно рекомендую autoNumeric JQuery плагин. Это хорошо поддерживается , и они в основном «мысль обо всем» я мог хотеть для валюты.

Я на самом деле использовать сочетание этих двух плагинов для форматирования номеров телефонов, цифровых форматов (ISBN, и т.д.), а также валюты (валюты США в основном).

Имейте в виду , что jquery.inputmaskэто в основном о контроле формат значением, в то время как autoNumericэто о конкретно контролировать формат валюты.

Ответил 12/06/2016 в 02:54
источник пользователем

голоса
0

Используя ответ Леандро, я добавляемые ^(?:[$]|)к началу , чтобы за предшествующий знак доллара

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

Это соответствует

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

Ничего не найдено

11124.52
234223425.345
234.
.5234
a
a.23
32.a
a.a
z548,452.22
u66.36
Ответил 29/06/2018 в 00:49
источник пользователем

голоса
0

Это то, что я использую:

Без ведущего + или -

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

С дополнительным ведущим + или -

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

Чистая скрипку: https://jsfiddle.net/compsult/9of63cwk/12/

Ответил 07/07/2016 в 21:41
источник пользователем

голоса
0

В случае, если вы хотите, чтобы учесть ошибки человека вы могли бы сделать регулярное выражение более либеральны, когда соответствие валюты. Я использовал 2-й хорошее регулярное выражение Кенга и сделал его немного более надежной для учета опечатки лет.

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

Это будет соответствовать любому из этих собственных или искалеченных цифр валюты, но не забрать дополнительный мусор на конце после пространства:

$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
Ответил 05/01/2013 в 18:15
источник пользователем

голоса
0

Я имел успех с этим (с битами и кусками от некоторых из вышеуказанных regexs). Только обрабатывает до тысячи, но должна быть не слишком трудно расширить, что

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)
}
Ответил 12/12/2012 в 18:35
источник пользователем

голоса
0

Я использую следующее регулярное выражение для проверки валюты:

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

Вы также можете позволить необязательный знак доллара:

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

Вы можете легко добавить тестирование для скобок вместо знака путем добавления

\( and \)
Ответил 29/11/2011 в 14:15
источник пользователем

голоса
0

Я смотрел на это тоже, и пришел к выводу, что лучше построить регулярное выражение на основе текущей культуры. Мы можем использовать

CurrencyPositivePattern 
CurrencyGroupSeparator
CurrencyDecimalSeparator

свойства , NumberFormatInfoчтобы получить нужный формат.

Изменить: что-то вроде этого

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

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

Ответил 25/08/2011 в 07:57
источник пользователем

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