web-dev-qa-db-ja.com

小数と桁区切り記号を含む数値の正規表現

JavaScriptを使用して、桁区切り記号または小数点を含む可能性がある数値を検証するための正規表現が必要です。最大値は9,999,999.99最小値0.01その他の有効な値:11,11111.11,111.11

無効な値:11111111,11,111111,

私は喜びで全探索しました。

17
Swifty
/^\d{1,3}(,\d{3})*(\.\d+)?$/

最小値と最大値について...まあ、私は正規表現ではそれをしませんが、最初に先読みを追加できます:

/^(?!0+\.00)(?=.{1,9}(\.|$))\d{1,3}(,\d{3})*(\.\d+)?$/

注:これにより0,999.00なので、次のように変更できます。

/^(?!0+\.00)(?=.{1,9}(\.|$))(?!0(?!\.))\d{1,3}(,\d{3})*(\.\d+)?$/

先頭の0は許可されません。

編集:
テスト: http://jsfiddle.net/pKsYq/2/

21
Loamhoof
((\d){1,3})+([,][\d]{3})*([.](\d)*)?

いくつかはうまくいきましたが、私はまだ正規表現も学んでいます。

ロジックは、1〜3桁が0〜1回、1つのコンマの後に3桁が何回でも続き、1つである必要があります。 0から1回、任意の桁数が続く

2
munch1324

以下の制限のために以下の正規表現を使用しました-

^(?!0|\.00)[0-9]+(,\d{3})*(.[0-9]{0,2})$
  1. 3桁の後に「、」(千の区切り記号)。
  2. 「。」 (小数点以下2桁まで)。
  3. .
1
Sanchi Girotra

Tezraの式は「1」で失敗します。または「1.0」。私の目的のために、次のように、先頭と末尾のゼロ、および先頭の+または-記号を許可します。

^[-+]?((\d{1,3}(,\d{3})*)|(\d*))(\.|\.\d*)?$
1
r4r4

まず、データの取得元のフォームを所有している場合、入力を制限する最善の方法は、適切なフォーム要素(別名、数値フィールド)を使用することです。

<input type="number" name="size" min="0.01" max="9,999,999.99" step="0.01">

「、」を入力できるかどうかはブラウザによって異なりますが、ブラウザは常に実際の数値として値を提供します。 (すべてのフォームデータはサーバー側でも検証/サニタイズする必要があることに注意してください。クライアントを信頼しないでください)


第二に、私は他の答えをより堅牢な(プラットフォームに依存しない)/変更可能な正規表現に拡張したいと思います。

  • 正規表現を^と$で囲み、そのサブセットだけでなく、整数に対しても一致することを確認してください。例^<my_regex>$
  • 小数部の右側はオプションなので、オプショングループ(<regex>)?に入れることができます。
  • リテラルのピリオドと数字のチェーンの照合は、単に\.\d+ です。
    • 小数部が0でない後の最後の数を主張したい場合は、[1-9]を「0以外の数」に使用できます。そのため、\.\d+[1-9]
  • 10進数の左側の場合、先頭の数値はゼロ以外、または数値はゼロです。だから([1-9]<rest-of-number-regex>|0)
  • 番号の最初のグループは1〜3桁なので、[1-9]\d{0,2}
  • その後、3秒で数字を追加する必要があります。したがって、(,\d{3})*
    • 覚えていますか?オプションであることを意味するので、を作成するには、オプションは(,?\d{3})*

すべてを一緒に入れて

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

最近のプロジェクトでは、国際的な要件を満たすために、このバージョンを変更する必要がありました。これは私たちが使用したものです:^-?(\d{1,3}(?<tt>\.|\,| ))((\d{3}\k<tt>)*(\d{3}(?!\k<tt>)[\.|\,]))?\d*$

名前付きグループの作成(?<tt>\.|\,| )否定的な先読みを使用できるようにしました(?!\k<tt>)[\.|\,])後で千単位のセパレータと小数点が実際に異なることを確認します。

0
kmpg