Утвердить десятичное значение до 2 десятичных знаков с аннотациями данных? - PullRequest
19 голосов
/ 05 марта 2012

У меня есть это в моей модели представления:

[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

Есть ли способ проверить это с помощью аннотации данных?

Ответы [ 7 ]

26 голосов
/ 05 марта 2012

Вы можете использовать атрибут RegularExpression с регулярным выражением, которое соответствует вашим критериям. Здесь есть целая куча выражений, которые включают числа, я уверен, что одно будет соответствовать всем требованиям. Вот ссылка .

Это поможет вам начать работу, хотя, возможно, оно не будет таким исчерпывающим, как вы хотите (требуется хотя бы одна цифра, начинающаяся с десятичной точки):

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

Обратите внимание, что трудно выдать точное сообщение об ошибке, потому что вы не знаете, какая часть регулярного выражения не соответствовала (например, строка "z.22" имеет правильное количество десятичных знаков, но не действительная цена).

18 голосов
/ 30 мая 2012
[RegularExpression(@"^\d+.\d{0,2}$",ErrorMessage = "Price can't have more than 2 decimal places")]
public decimal Price { get; set; }

Это будет обслуживать от 0 до 2 десятичных знаков, или ни одного вообще.

5 голосов
/ 03 ноября 2014

Вы также можете создать свой собственный атрибут проверки десятичного числа, унаследованный от 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);
    }
 }

и зарегистрировать его для включения проверки на стороне клиента в Application_Start ():

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(DecimalAttribute), typeof(RegularExpressionAttributeAdapter));
4 голосов
/ 13 марта 2012
[RegularExpression(@"^\d+(\.\d)?$", ErrorMessage = "It cannot have more than one decimal point value")]
[Range( 0.1,100)]
public double xyz{get;set;}         

У меня работает до одного десятичного значения

2 голосов
/ 05 марта 2012

Вы можете выполнить эту проверку с помощью регулярного выражения и применить его с атрибутом RegularExpression.

1 голос
/ 21 апреля 2015

У меня был тот же сценарий, что и у OP, но предоставленные ответы не дают решения, которое работает для всех следующих случаев:

12, 12.3 and 12.34

Для этого мы используем следующее регулярное выражение:

[RegularExpression(@"^\d+(.\d{1,2})?$")]
0 голосов
/ 20 мая 2015

Аналогично mattytommo . Вам нужно сбежать ». - иначе ЛЮБОЙ персонаж будет принят

[RegularExpression(@"^\d+(\.\d{1,2})?$")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...