2016-07-14 4 views
0

「テキスト」型入力のパターンを作成して、0から特定の最大値までと同時に有効にし、小数点以下の桁数。最大値と最大小数点以下の桁でテキスト入力を検証するための正規表現パターン

クイック例: 最大値= 300.86 最大小数点以下の桁数= 3つの

有効入力:
300.86
300.85
300.850
300.851
.2
0.3333

無効な入力:
-1
300.87
300.861
1,30.2
1、0.0
、0.1

現在、私が唯一の小数点以下の数を検証する方法を知っていますこのパターンを使用する場所:
^ [、0-9] *(。\ d {1、{0}})?$

注:0私はそれで任意のパターンを使用することはできませんので私はこのような何かを考える

+1

正規表現は、数字の大きさを判断するための素晴らしいツールではありません。 .NETコードを使用して最大限度を確認し、小数点以下のバリデーターも適用できますか?これは、すべての正規表現よりも私にとってはきれいです。 –

+0

@ClasG申し訳ありませんが、私はそれを逃しました。それは有効ではありません。カンマで数字を受け入れたことを示したかっただけです。 – hisoka21

答えて

0

:(

が助けてくださいタイプ=番号を使用することはできません、あなたがしているものです後:

^(300(?:\.(?:[0-7]\d{0,2}|8(?:[0-5]\d?|60?)?))?|[0-2]?\d{0,2}(?:\.\d{0,3})?)$ 

See it here at REGEX STORM

(REGEXのSTORMがラインの端部に$と一致しないので???複数行を選択したにもかかわらず、\rで終了するように、そこに微調整しなければならなかった)

説明

それは2つの部分を持っています。後者の[0-2]?\d{0,2}(?:\.\d{0,3})?は300未満の数をテストします。オプションで0,1または2[0-2]?)で始まります。その後、任意の2桁の数字を続けることができます(\d{0,2})。次に、オプションで、.が続きます(存在する場合は、最大3桁(小数)((?:\.\d{0,3})?)が続きます。

最初の部分 - 300(?:\.(?:[0-7]\d{0,2}|8(?:[0-5]\d?|60?)?))? - 整数部分が正確に300の場合のテスト。その後、必要に応じて小数点に続く、3例中であってもよい。

    [0-7]\d{0,2}
  • 最大2桁の数字が続く7の範囲0の数字は、
  • 8(?:[0-5]\d*|60*)?桁続い8任意で桁が続く([0-5]\d?交互)、0から5の範囲で指定します。
  • または番号86及びoptionall 060?交替)

これらの部品は、交互に分離された捕捉基 - |。式全体は、文字列(^)(または複数行フラグ付き)の先頭と末尾($)にある必要があります。

編集

は「誤って失敗したいくつかの数字を引き起こすいくつかの調整を完了します。

編集2

完全に一部 "小数点以下の桁数の最大値を" 逃しました。一定。 (「有効な」例で騙された)0.3333

+0

FYI:複数行モードの '$'は '\ n \ 'の前に、' \ r \ n'の前にはマッチしません。 –

+0

OK。知っておいてよかった。ありがとう@WiktorStribiżew – ClasG

+0

@ClasG wow nice regex カンマで数字に失敗しましたが、私がそれを微調整できれば試してみます – hisoka21

0

私はC#について何も知らないので、私がPythonでできることを仮定する必要があります.C#で行う方法があります。擬似コードで私の提案をお伝えします(これはPythonをミラーリングするためのものではありません)。

maxValue = some number 
nDecimals = some number 
givenValue = text with some number to be tested 

#split number on decimal; remove non-digit characters from each side 
leftSideOfDecimal = Replace(pattern = '^(\d{1,3}(,\d{3})*)(\.\d*)$', replacement = '\1', givenValue) 
leftSideOfDecimal = Replace(',', '', leftSideOfDecimal) 
rightSideOfDecimal = Replace('^(\d{1,3}(,\d{3})*)(\.\d*)$', '\3', givenValue) 
rightSideOfDecimal = Replace('\.','',rightSideOfDecimal) 

leftSideOfDecimal = pass leftSideOfDecimal to function to change type from text to integer 

if leftSideOfDecimal <= maxValue and numberOfCharacters(rightSideOfDecimal) == nDecimals: 
    do whatever you want 

また、あなたは(10進数またはカンマなどの)指定された文字の文字列を分割することが可能な機能を持っている場合は、あなただけの小数で入力を分割し、同様に第一の側をクリーンアップコードを作成し、上のコードの最後の3行に進みます。そうすれば、複雑な正規表現を使う必要がなくなります。

+0

私はここで推測していますが、OPにコードを使用するオプションがある場合、OPはおそらく 'if((decimal.Parse(sVal)<= dLimit )&&(sVal.Length-sVal.LastIndexOf( '。')<= 4)... ' – ClasG

+0

@Chad申し訳ありませんが、クライアント側で検証が必要です。 – hisoka21

関連する問題