2017-01-16 20 views
3

以下のパターンで整数を検証する必要があります。整数部分は5文字まで、小数部分は2文字までを持つことができます。 (端数は任意です)。 +または - もオプションです。正規表現で小数点以下を確認する

(+/-) mmmmm (5).nn (2) 

テストデータ

Valid 
-1 
+1 
1 
+.1 
-.1 
.1 
+11111.11 
-11111.11 
11111 

Invalid 
+111111.11 
-111111.11 
+11111.111 
-11111.111 
11111.111 
111111.11 
+1. 
-1. 
1. 

これは、私は現在、

[+-]?\d{0,5}\.?\d{1,2}? 

を使用するものである。この正しいですか?私は明白な何かを欠いていますか

ここにはtest caseがあります。

EDIT

精度に含まれるスケールからの桁数を持つ付加的な制約がある場合。

たとえば、DECIMAL(5,2)は1234.5という形式の番号を定義し、DECIMAL(5,5)は1.2345という形式の番号を定義します。これをどのように変更する必要がありますか?

答えて

3

実行します。開始時

^[+-]?(?:[0-9]{1,5})?(?:\.[0-9]{1,2})?$ 
  • ^[+-]?マッチ+または-、5桁に1、オプションの
  • (?:\.[0-9]{1,2})?$は、1つのまたは2つの数字が続く、文字通りのドットと一致するオプション
  • (?:[0-9]{1,5})?試合最後に、オプションです。リテラル.は、以下の数字パターンと非捕捉グループ内、それだけで必要な数字はその後
  • JavaScriptで

Demo

2

がある場合、あなたは

を使用して番号を検証することができ照合されますされたよう
Number(n) === Number(n) 

nの任意の非数値については、「abc」または[1, 2, 3]のように、Number(n)はNaNを返します。いずれにしてもNaN !== NaNとすれば、nが数字であるかどうかを簡単に知ることができます。

Numberコンストラクタに数値表現のほぼすべてのフォームで正常に動作します:あなたは正規表現を使用して拘束されている場合は、しかし、

Number(123) // -> 123 
Number('123') // -> 123 
Number('+12e+3') // -> 12000 
Number('-1.2e-3') // -> -0.0012 
Number('--123') // -> NaN 

、それはあなたが説明したものに非常に近いです:

  1. オプション」 + "または" - "
  2. 0〜5桁。
  3. オプション "。"小数点以下1桁から2桁です。部分全体はオプションです。つまり、数字のない1つのドットが無効です。

指数型はありません。一部(\.\d{1,2})?は全部オプションであることに注意してください

/^[+-]?\d{0,5}(\.\d{1,2})?$/.test(123) // -> true 
/^[+-]?\d{0,5}(\.\d{1,2})?$/.test('123') // -> true 
/^[+-]?\d{0,5}(\.\d{1,2})?$/.test('+123.45') // -> true 
/^[+-]?\d{0,5}(\.\d{1,2})?$/.test('--123') // -> false 
/^[+-]?\d{0,5}(\.\d{1,2})?$/.test('-123.456') // -> false 

ように。

/^[+-]?\d{0,5}(\.\d{1,2})?$/ 

だろう

あなたの場合、ドットまたは2つの10進数のいずれかはオプションなので、 "123"有効な数字になります。 Javascriptでは有効ですが、問題はありません。

1

あなたの正規表現の作品に若干の変更:

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

または

^[+-]?\d{0,5}?(\.\d{1,2})?$

Demo1

Demo2

関連する問題