web-dev-qa-db-ja.com

データ注釈を使用して小数値を小数点以下2桁に検証しますか?

私はビューモデルにこれを持っています:

[Required(ErrorMessage = "Price is required")]
[Range(0.01, 999999999, ErrorMessage = "Price must be greater than 0.00")]
[DisplayName("Price ($)")]
public decimal Price { get; set; }

ユーザーが小数点以下2桁を超えて入力しないことを検証したいと思います。だから私は持ってみたい

有効な値:12、12.3、12.34

無効な値:12.、12.345

これをデータ注釈で検証する方法はありますか?

19
Steven

条件に一致する正規表現でRegularExpression属性を使用できます。ここには数字が関係する表現がたくさんありますが、私はその1つが法案に適合すると確信しています。 リンク です。

これはあなたが始めるようになりますが、あなたが望むほど包括的ではないかもしれません(小数点の前に少なくとも1桁の数字が必要です):

[RegularExpression(@"\d+(\.\d{1,2})?", ErrorMessage = "Invalid price")]

正規表現のどの部分が一致しなかったかわからないため、正確なエラーメッセージを出力するのは難しいことに注意してください(たとえば、文字列 "z.22"の小数点以下の桁数は正しいですが、有効な価格ではありません) )。

26
jlew
[RegularExpression(@"^\d+.\d{0,2}$",ErrorMessage = "Price can't have more than 2 decimal places")]
public decimal Price { get; set; }

これは、小数点以下0〜2桁に対応するか、まったくありません。

18
Jonathan

RegularExpressionAttribute から継承して、独自のDecimal検証属性を作成することもできます。

 public class DecimalAttribute : RegularExpressionAttribute
 {
    public int DecimalPlaces { get; set; }
    public DecimalAttribute(int decimalPlaces)
        : base(string.Format(@"^\d*\.?\d{{0,{0}}}$", decimalPlaces))
    {
        DecimalPlaces = decimalPlaces;
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format("This number can have maximum {0} decimal places", DecimalPlaces);
    }
 }

application_Start()でクライアント側の検証を有効にするために登録します。

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(DecimalAttribute), typeof(RegularExpressionAttributeAdapter));
5
domenu
[RegularExpression(@"^\d+(\.\d)?$", ErrorMessage = "It cannot have more than one decimal point value")]
[Range( 0.1,100)]
public double xyz{get;set;}         

それは私のために1つの小数まで機能します

4
Gurarpan

正規表現を使用してこの検証を行い、RegularExpression属性で適用できます。

2
Ion Sapoval

私はOPと同じシナリオを持っていましたが、提供された答えは、次のすべてのケースで機能するソリューションを提供しません:

12, 12.3 and 12.34

そのためには、次の正規表現を使用します。

[RegularExpression(@"^\d+(.\d{1,2})?$")]
1
mattytommo

mattytommoと同様です。 「。」をエスケープする必要があります-それ以外の場合は、任意の文字が受け入れられます

[RegularExpression(@"^\d+(\.\d{1,2})?$")]
0
MichalS