Подтвердить что ты не робот

Что такое "Лучший" Валютный реестр США?

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

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

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

Мое единственное требование состоит в том, что совпадающая строка - это U.S Currency и анализирует 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. 
4b9b3361

Ответ 1

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

Номер: сумма валюты (центы обязательно) Дополнительные разделители тысяч; обязательная двузначная доля

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})?)$

Ответ 2

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

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

"^\$?\-?([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}))\)$"

Ответ 3

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

^-?(?: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 зависит от языка, трудно сделать в регулярном выражении, за исключением, возможно, при его создании. Я предположил, что цифры группируются тремя, даже если в некоторых культурах (локалях) существуют разные правила.
Тривиально добавлять туда пробелы.

Ответ 4

Ответ Keng идеален, я просто хочу добавить, что для работы с 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

Ответ 5

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

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

Для валюты я настоятельно рекомендую autoNumeric плагин jQuery. Он ухожен, и они в основном "думали обо всем", что я мог бы хотеть для валюты.

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

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

Ответ 6

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

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

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

Ответ 7

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

^-?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 \)

Ответ 8

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

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)
}

Ответ 9

Если вы хотите учесть человеческую ошибку, вы можете сделать регулярное выражение более прощающим при сопоставлении валюты. Я использовал второе регулярное выражение Keng 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

Ответ 10

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

Без указаний + или -

^\$\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}$

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