0

米国通貨の正規表現でいくつかの課題に直面しています。米国の通貨形式について簡単に調査した結果、驚くほど機能する次の正規表現にたどり着きました。

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

他の要件に応じて、以下のように変更しました。したがって、この次の例では、小数点以下の桁数 (.) を 10 に制限することに成功しています。ただし、さらにいくつかの課題があります。

^[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{0,**10**})?$
  • RegEx で 0.99 と .99 も検証する必要があります。上記の RegEx では、0.99 は検証されますが、.99 は一致しません。したがって、正規表現を次のように更新しました。^[0-9]{**0**,3}(?:,?[0-9]{3})*(?:\.[0-9]{0,10})?$

これで現在の問題は解決しましたが、今では ,333,323 パターンにも一致しました。

  • 正規表現を更新して 10 桁に制限しましたが、小数点以下 18 桁に制限する必要もあります (米国通貨の区切り文字 "," なし)。いくつかのパターンを試しましたが、うまくいきませんでした。

どんな助けでも大歓迎です。

4

3 に答える 3

1

これを試して:

^\d{,3}(?:(?:[^\b],)?\d{3}){,5}(?:\.\d{,10})?$

あなたが言及した問題は解決しますが、それでもこの正規表現にはいくつかの問題があります。たとえば、99,999999.55 と 0,123.45 を許可します。

于 2012-08-14T14:46:47.780 に答える
0

"これで現在の問題は解決しましたが、今では ,333,323 パターンにも一致しました。 "
この要件の正規表現を次のように変更しました。

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

ただし、小数点の前に18桁のみに制限する必要もあります(米国通貨の区切り記号「、」なし)
。カンマ区切り記号はまだ必要ですが、小数点の前の桁数を18に制限したいと思いますカンマを除く. つまり、0 ~ 5 セットの ",ddd" を使用できます。この仮定が間違っているかどうか教えてください。この要件のために変更された正規表現:

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

更新 1:
@davidrac が言及したように、99,999999.55 と一致しないように正規表現を編集しました。

更新 2:
先頭のゼロを削除するように正規表現を編集しました

更新 3:
すべての修正が組み込まれました。他に抜けがないか確認してください。

于 2012-08-14T14:38:12.467 に答える
0

どうですか:

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

説明:

The regular expression:

(?-imsx:^(?:[0-9]{1,3}(?:,?[0-9]{3})*)?(?:\.[0-9]{0,10})?$)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ^                        the beginning of the string
----------------------------------------------------------------------
  (?:                      group, but do not capture (optional
                           (matching the most amount possible)):
----------------------------------------------------------------------
    [0-9]{1,3}               any character of: '0' to '9' (between 1
                             and 3 times (matching the most amount
                             possible))
----------------------------------------------------------------------
    (?:                      group, but do not capture (0 or more
                             times (matching the most amount
                             possible)):
----------------------------------------------------------------------
      ,?                       ',' (optional (matching the most
                               amount possible))
----------------------------------------------------------------------
      [0-9]{3}                 any character of: '0' to '9' (3 times)
----------------------------------------------------------------------
    )*                       end of grouping
----------------------------------------------------------------------
  )?                       end of grouping
----------------------------------------------------------------------
  (?:                      group, but do not capture (optional
                           (matching the most amount possible)):
----------------------------------------------------------------------
    \.                       '.'
----------------------------------------------------------------------
    [0-9]{0,10}              any character of: '0' to '9' (between 0
                             and 10 times (matching the most amount
                             possible))
----------------------------------------------------------------------
  )?                       end of grouping
----------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

いくつかの例:

match : 1,234.45
match : .123
match : 0.12345
match : 123456.7890123
not match : ,123,456.789
于 2012-08-14T15:03:52.760 に答える