2012-03-04 12 views
15

ho questo nel mio modello di vista:Convalida il valore decimale a 2 cifre decimali con annotazioni di dati?

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

mi piacerebbe verificare che l'utente non immette più di 2 cifre decimali. Così mi piacerebbe avere

valori validi: 12, 12.3, 12.34

Valori non validi: 12., 12.345

C'è un modo per convalidare questo con un'annotazione di dati?

risposta

19

È possibile utilizzare l'attributo RegularExpression, con un'espressione regolare che corrisponde ai criteri. Ci sono un sacco di espressioni qui che coinvolgono numeri, sono sicuro che si adatteranno al conto. Ecco lo link.

Questo ti permetterà di cominciare, anche se potrebbe non essere il più inclusivo come si vuole (richiede almeno una cifra che porta il punto decimale):

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

Nota che è difficile per emettere un messaggio di errore preciso perché non si sa quale parte della regex non è riuscita ad abbinare (la stringa "z.22" ha il numero corretto di posizioni decimali, ad esempio, ma non è un prezzo valido).

+1

Questo non funziona per le lingue con separatore decimale diverso da punto (.), ad es. comma (14,6), poiché RegularExpression converte decimale in stringa utilizzando la cultura corrente. – jahav

+0

Che ne dici di '^ \ d * (\. |, | (\. \ D {1,2}) | (, \ d {1,2}))? $' Che prende sia il punto che la virgola, inoltre non consente cifre iniziali prima del punto o nessuna cifra dopo il punto. – helrich

+0

Per qualche motivo, data l'espressione regolare, è possibile inserire più punti decimali, ad esempio 1.22.3.44 – Storm

2

È possibile effettuare questa convalida utilizzando un'espressione regolare e applicarla con l'attributo RegularExpression.

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

funziona per me fino a un valore decimale

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

Questo cercherà di soddisfare per 0 a 2 cifre decimali, o del tutto assenti.

+0

È possibile che si desideri uscire da "." (che significa "qualsiasi carattere" se non è sfuggito) per dare^\ d + \. \ d {0,5} $ – Appetere

+2

Oops, mi spiace significa^\ d + \.? \ d {0,5} $ con il '?' per consentire solo 0 o 1 ripetizioni. – Appetere

+0

Questo in realtà non consente un valore senza cifre decimali, ad esempio '10', ** Tuttavia **, non consente la decimale con un punto:' 10.' – mattytommo

4

È inoltre possibile creare il proprio attributo di convalida decimale, che eredita da 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); 
    } 
} 

e registrarlo per abilitare la convalida lato client in Application_Start():

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(DecimalAttribute), typeof(RegularExpressionAttributeAdapter)); 
0

Ho avuto lo stesso scenario come l'OP, ma le risposte fornite non danno una soluzione che funziona per tutti i seguenti casi:

12, 12.3 and 12.34

Per fare questo, si usa la seguente espressione regolare:

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

Simile a mattytommo. Devi scappare '.' - altrimenti verrà accettato QUALUNQUE carattere

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