2012-03-04 18 views
15

tengo esto en mi modelo de vista:Validar valor decimal a 2 decimales con anotaciones de datos?

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

me gustaría validar que el usuario no introduce más de 2 cifras decimales. Así que me gustaría tener

valores válidos: 12, 12.3, 12.34

valores no válidos: 12., 12.345

¿Hay una manera de validar esto con una anotación de datos?

Respuesta

19

se puede utilizar el atributo RegularExpression, con una expresión regular que coincida con sus criterios. Aquí hay un montón de expresiones que involucran números, estoy seguro de que encajarán en la cuenta. Aquí está el link.

Esto le ayudará a empezar, aunque puede que no sea tan inclusivo como desee (requiere al menos un dígito inicial del punto decimal):

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

Tenga en cuenta que es difícil emitir un mensaje de error exacto porque no se sabe qué parte de la expresión regular no pudo emparejar (el "z.22" cadena tiene el número correcto de cifras decimales, por ejemplo, pero no es un precio válido).

+1

Esto no funciona para los idiomas con separador decimal que no sea el punto (.), p. coma (14,6), porque RegularExpression convierte decimales en cadena utilizando la cultura actual. ¿Qué hay de – jahav

+0

'^ \ d * (\ |., | (\ \ D {1,2}) |. (, \ D {1,2}))? $' Que tiene tanto punto y coma, también permite ningún dígitos iniciales antes del punto o ningún dígito después del punto. – helrich

+0

Por alguna razón, dada la expresión regular me permite insertar puntos decimales múltiples, por ejemplo: 1.22.3.44 – Storm

2

Usted puede hacer esta validación mediante el uso de una expresión regular y aplicarlo con el atributo RegularExpression.

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

funciona para mí hasta un valor decimal

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

Esto se ocupará de 0 a 2 cifras decimales, o ninguno en absoluto.

+0

Es posible que desee escapar de la '.' (lo que significa "cualquier carácter" si no se ha escapado) para dar^\ d + \. \ d {0,5} $ – Appetere

+2

Vaya, lo siento significaba^\ d + \.? \ d {0,5} $ con el '?' para permitir solo 0 o 1 repeticiones. – Appetere

+0

Esto realmente no permite un valor sin decimales es decir '10', ** Sin embargo **, no permite decimales con un punto:' 10.' – mattytommo

4

También puede crear su propio atributo de validación decimal, heredando 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); 
    } 
} 

y registrarlo para activar la validación del lado del cliente en Application_Start():

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

que tenían la misma escenario como el PO, sin embargo, las respuestas proporcionadas no dan una solución que funcione para todos los siguientes casos:

12, 12.3 and 12.34

Para ello, se utiliza la siguiente expresión regular:

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

similares a mattytommo. Tienes que escapar '.' - De lo contrario, se aceptará CUALQUIER carácter

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