67

currency regex をすばやく検索すると、多くの結果が表示されます。

1 つを選択する際の問題は、すべてのエッジ ケースをテストせずに正規表現を検証するのが難しいことです。徹底的にテストされた米国通貨の正規表現を持っている人はいますか?

私の唯一の要件は、一致した文字列が米国の通貨であり、次のように解析されることSystem.Decimalです。

[ws][符号][数字、]数字[.小数桁][ws]

角括弧 ([ および ]) 内の要素はオプションです。
次の表では、各要素について説明します。

要素の説明
ws オプションの空白。
sign オプションの記号。
数字 0 から 9 までの一連の数字。
、カルチャ固有の千単位の区切り記号。
. カルチャ固有の小数点記号。
小数桁 0 から 9 までの一連の数字。
4

13 に答える 13

107

これは Regex Buddy の作成者によるものです。これらはライブラリからのものなので、完全にテストされていると確信しています。

数値: 金額 (セントは必須) オプションの千単位の区切り文字。必須の 2 桁の分数

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

数値: 金額 (セントはオプション) オプションの桁区切り記号。オプションの 2 桁の分数

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

数値: 通貨金額 US & EU (オプションでセント) US スタイルの 123,456.78 表記とヨーロッパ スタイルの 123.456,78 表記を使用できます。オプションの桁区切り記号。オプションの 2 桁の分数

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{2})?|(?:,[0-9]{3})*(?:\.[0-9]{2})?|(?:\.[0-9]{3})*(?:,[0-9]{2})?)$
于 2008-12-09T20:57:54.487 に答える
22

この正規表現は、Kirk Fuller と Gregg Durishan による 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}))\)$"
于 2008-12-09T21:20:00.260 に答える
10

完全にテストされていません (私が書いたばかりです!) が、正しく動作しているようです:

^-?(?: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 はロケールに依存しており、おそらくビルドする場合を除いて、正規表現で作成するのは困難です。一部の文化 (ロケール) では異なる規則がある場合でも、数字は 3 でグループ化されると想定しました。
その周りに空白を追加するのは簡単です。

于 2008-12-09T21:52:01.990 に答える
3

Keng の答えは完璧です。1 桁または 2 桁の小数を処理するために追加したいだけです (3 番目のバージョンの場合)。

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

ネット フィドル: https://dotnetfiddle.net/1mUpX2

于 2014-12-15T19:16:44.267 に答える
3

人的エラーを考慮したい場合は、通貨を照合するときに正規表現をより寛容にすることができます。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
于 2013-01-05T17:15:13.767 に答える
2

この質問は数年前のものなので、最新の回答をしたいと思いました。

私はjQuery InputMaskを使用しており、入力/フォーマット マスキング (電話番号など) には非常にうまく機能しますが、私の経験から、通貨にはうまく機能しません。

通貨については、autoNumeric jQuery プラグインを強くお勧めします。それはよく維持されており、彼らは基本的に私が通貨に望むことができる「すべてを考えた」.

私は実際に、これらのプラグインの両方を組み合わせて、電話番号、数値形式 (ISBN など)、および通貨 (主に米国通貨) をフォーマットするために使用しています。

jquery.inputmask主に値の形式を制御することautoNumericですが、特に通貨の形式を制御することを念頭に置いてください。

于 2016-06-12T02:54:49.760 に答える
1

通貨の検証に次の正規表現を使用しています。

^-?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 \)
于 2011-11-29T13:15:35.520 に答える
1

私もこれを見ていましたが、現在の文化に基づいて正規表現を構築するのが最善であるという結論に達しました。を使用できます

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

于 2011-08-25T06:57:22.013 に答える
1

私はこれで成功しました(上記の正規表現の一部から少しずつ取っています)。数千までしか処理できませんが、それを拡張するのはそれほど難しくありません

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)
}
于 2012-12-12T17:35:01.287 に答える