3

Range(decimal, decimal,...)モデルの物件に応募しました。検証はしません.99が、検証し0.99ます。

先頭のゼロを許可するには?

4

1 に答える 1

1

これは、デフォルトでASP.NETMVC3に付属している正規表現jquery.validate.jsとファイルの数のバグです。jquery.validate.min.js

jquery.validate.js1048行目のコードは次のとおりです。

// http://docs.jquery.com/Plugins/Validation/Methods/number
number: function(value, element) {
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
}

この関数は、数値正規表現に対して文字列のテストを実行します。これを修正するには、regexpを次の正規表現に置き換えます/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/

これは短いバージョンです。ここに説明があります:

バギー^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$正規表現は次のようになります。

^-?
  Beginning of line or string
  -, zero or one repetitions
Match expression but don't capture it. [\d+|\d{1,3}(?:,\d{3})+]
  Select from 2 alternatives
      Any digit, one or more repetitions
      \d{1,3}(?:,\d{3})+
          Any digit, between 1 and 3 repetitions
          Match expression but don't capture it. [,\d{3}], one or more repetitions
              ,\d{3}
                  ,
                  Any digit, exactly 3 repetitions
Match expression but don't capture it. [\.\d+], zero or one repetitions
  \.\d+
      Literal .
      Any digit, one or more repetitions
End of line or string

ご覧のとおり、2番目のキャプチャグループは形式(?:\.\d+)?の数値を許可し.XXますが、一致する場合、最初のグループが最初にチェックされ、最初のグループが一致する必要(?:\d+|\d{1,3}(?:,\d{3})+)があるため、検証は失敗します。

http://docs.jquery.com/Plugins/Validation/Methods/numberデモを参照し、番号の検証のために正規表現を調べると、次のようになります^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$。これはバグのあるグループと同じですが、最初に一致するグループは、zero or one repetitionsつまりオプションである必要があります。そして、この?regexpの追加により、バグが修正されます。

編集:これはMVC4のデフォルトテンプレートにも適用されます。どちらのテンプレートも1.9.0バージョンのプラグインを使用しています。バージョン1.10.0では、この問題は修正されました。変更ログから:

  • 先行ゼロのない小数の正規表現の問題を修正しました。新しいメソッドテストを追加しました。修正#41

したがって、常に最新の状態を維持することをお勧めします。

于 2013-02-14T16:35:08.030 に答える