web-dev-qa-db-ja.com

正規表現の通貨検証

JQuery関数の通貨正規表現のヘルプが必要です。

  • オプションで、開始時に「$」記号を1回だけ許可します。
  • これは、コンマをデジタルグループセパレータとして許可しますが、先頭または末尾には許可しません。
  • 小数点の後に丸められるのは2桁のみです。
  • 小数点を1つだけ使用でき、先頭または末尾には使用できません。

有効:

$1,530,602.24
1,530,602.24

無効:

$1,666.24$
,1,666,88,
1.6.66,6
.1555.

/^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i;を試しました。 1,6,999と一致する以外は問題なく動作します。

29
user2205924

正規表現

// Requires a decimal and commas
^\$?(([1-9]\d{0,2}(,\d{3})*)|0)?\.\d{1,2}$

// Allows a decimal, requires commas
(?=.*\d)^\$?(([1-9]\d{0,2}(,\d{3})*)|0)?(\.\d{1,2})?$

// Decimal and commas optional
(?=.*?\d)^\$?(([1-9]\d{0,2}(,\d{3})*)|\d+)?(\.\d{1,2})?$

// Decimals required, commas optional
^\$?(([1-9]\d{0,2}(,\d{3})*)|0)?\.\d{1,2}$

// *Requires/allows X here also implies "used correctly"

正規表現の内訳

  • オプション部分が自由すぎる場合、先読みして、数字があることを保証する必要があります:(?=.*\d)
  • ドル記号で始まる場合とそうでない場合があります(マイナスは無効であると想定しています):^\$?
    • -?を続けて、負の数を許可します
  • 1〜3の数字で始まります:[1-9]\d{0,2}
    • ほとんど(\d{1,3})ですが、「0,123」を許可します
    • 1つの例外は、「$ 0.50」または「0.50」の場合は0から開始できます。|0
    • これらの正規表現は、複数の先行0が無効であると想定しています
  • コンマで区切られた3桁の数字:(,\d{3})*
    • 「$」で始まる番号を禁止する場合は、?の前にある\.を削除します。
  • 10進数(1桁または2桁)が必要または許可:\.\d{1,2}または(\.\d{1,2})?
  • $(エスケープなし)で終了し、有効な番号($ 1,000.00bなど)の後に何もないことを確認します

正規表現を使用するには、文字列のmatchメソッドを使用し、2つのスラッシュの間に正規表現を入れます。

// The return will either be your match or null if not found
yourNumber.match(/(?=.)^\$?(([1-9][0-9]{0,2}(,[0-9]{3})*)|0)?(\.[0-9]{1,2})?$/);

// For just a true/false response
!!yourNumber.match(/(?=.)^\$?(([1-9][0-9]{0,2}(,[0-9]{3})*)|0)?(\.[0-9]{1,2})?$/);

基本的な使用例

テストケース付きデモ

var tests = [
    "$1,530,602.24", "1,530,602.24", "$1,666.24$", ",1,666,88,", "1.6.66,6", ".1555."
];

var regex = /(?=.*\d)^\$?(([1-9]\d{0,2}(,\d{3})*)|0)?(\.\d{1,2})?$/;

for (i = 0; i < tests.length; i++) { 
  console.log(tests[i] + ' // ' + regex.test(tests[i]));
  document.write(tests[i] + ' // ' + regex.test(tests[i]) + '<br/>');
}
111
Gary