web-dev-qa-db-fra.com

Valider la valeur décimale à 2 décimales avec des annotations de données?

J'ai ceci dans mon modèle de vue:

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

J'aimerais valider que l'utilisateur n'entre pas plus de 2 décimales. Donc j'aimerais avoir

Valeurs valides : 12, 12.3, 12.34

Valeurs non valides : 12., 12.345

Existe-t-il un moyen de valider cela avec une annotation de données?

16
Steven

Vous pouvez utiliser l'attribut RegularExpression, avec une expression régulière correspondant à vos critères. Il y a beaucoup d'expressions ici qui impliquent des chiffres, je suis sûr que l'une d'entre elles conviendra au projet de loi. Voici le lien .

Cela vous aidera à démarrer, même s’il n’est peut-être pas aussi inclusif que vous le souhaitez (nécessite au moins un chiffre précédant le point décimal):

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

Notez qu'il est difficile d'émettre un message d'erreur précis car vous ne savez pas quelle partie de l'expression rationnelle n'a pas correspondu (la chaîne "z.22" contient le nombre correct de décimales, par exemple, mais ne représente pas un prix valide. ).

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

Cela couvrira de 0 à 2 décimales, voire aucune.

18
Jonathan

Vous pouvez également créer votre propre attribut de validation Decimal, en héritant de RegularExpressionAttribute :

 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);
    }
 }

et enregistrez-le pour activer la validation côté client dans 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;}         

Cela fonctionne pour moi jusqu'à une valeur décimale

4
Gurarpan

Vous pouvez effectuer cette validation en utilisant une expression régulière et l'appliquer avec l'attribut RegularExpression.

2
Ion Sapoval

J'ai eu le même scénario que l'OP, mais les réponses fournies ne donnent pas une solution qui fonctionne pour tous les cas suivants:

12, 12.3 and 12.34

Pour ce faire, nous utilisons l'expression régulière suivante:

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

Similaire à mattytommo . Tu dois t'échapper '.' - sinon TOUT caractère sera accepté

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