2012-01-23 20 views
4

私はsymfony2エンティティをDoctrineを使ってテーブルにマップしました。特性の1つは、次のとおりです。symfony 2の小数点の妥当性チェック

/** 
* @var decimal $price 
* 
* @ORM\Column(name="price", type="decimal", nullable=false) 
*/ 
private $price; 

Assert$priceが有効な小数である必要があり、私の要件を満たすでしょうか?

私はと-された文字列NaNがこのように有効な小数点値として扱わfloat(NaN)としてマッピングされているため、文字列NaNを渡すと、検証を通過する間に小数値は、検証エラーにつながるとして、文字列fooを渡す事をご利用いただけます。

どのような回避策ですか?

symfonyの開発チームは、それは問題ではありません保証:まあhttps://github.com/symfony/symfony/issues/3161

、そうでない場合 - それを検証するための解決策は、おそらくそこにあります。何か案は?

+0

そして、誰かが検証で 'NaN'を許可する必要がある場合はどうなりますか? ) – meze

+0

@meze:omg))基本的な例題をうまく使いこなすために必要なステップはどれぐらいですか? ;-) – zerkms

+0

あなたは 'NaN'は小数点以下の妥当な値だと言い、そうしたいので0に変換したいと思う;) – meze

答えて

6

Symfonyのドキュメントを見ると、小数点用のバリデータが組み込まれていません。コールバックバリデータを使用することもできますが、この記事のように独自のカスタムバリデータを作成することもできます。describes here

実際の検証については、is_numericis_floatの組み合わせを使用して確認します。正規表現を使用する方法がありますが、値がis_numericまたはis_floatのいずれかを満たしていれば、それが有効な小数(または整数)であると見なすことができます。

EDIT:

たぶん最善の解決策は、文字列として小数を検証することです。以下のような何か...

$stringDecimal = strval($decimalValue); 
return (preg_match(/[0-9]+(\.[0-9][0-9]?)?/, $stringDecimal) !== 0); 

これは(あなたが簡単に「1.15adowadjaow」を渡すことができ、それが検証します)完璧ではないであるが、それはあなたが後にしているものの基礎を提供しています。上の正規表現を、0-9、フルストップまたはカンマ以外のものを検索するものと組み合わせる(ヨーロッパの小数フォーマットに対応したい場合に応じて)。

+0

'float(NaN)'は 'is_float'と' is_numeric'の両方を渡します – zerkms

+0

まず文字列にキャストし、その値が 'NaN'と等しくないことを確認しますか? – JamesHalsall

+0

:カスタムバリデータの-S? – zerkms

2

custom validatorを試すと、その文字列だけをチェックできます。

+1

はい、私はその可能性について知っていますが、有効であるかどうかをチェックする可能性のないタイプを提供するのはちょうど嫌です。 – zerkms

+0

"そのストリングのために」これは実際にはひどい解決策です。私はどんな魔法の紐についても知りませんでした。私はデータが有効かどうかをチェックし、データ*が無効かどうかをチェックしません。 – zerkms

1

あなたは、レコード

 ->add(
      'amount', 
      'text', change text to number and it will be validated 
      [ 
       'required' => true 
      ] 
     ) 

それとも、

  • @assert \レンジを主張レンジ使用することができるためにフォームタイプを使用している場合は(最小= 0)

それがいることを検証しますそれは数字でなければなりません

+0

'float(NaN)'は数字ではありませんか?プラス 'min = 0'は異なるセマンティクスを持ちます。 – zerkms

関連する問題