Локализация чисел decimal

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 1.11.2015

При работе с данными типа decimal при использовании клиентской валидации через javascript у нас может возникнуть проблема: так как у нас русскоязычная культура, то в качестве разделителя дробной и целой частей в числах будет использоваться запятая, однако библиотеки валидации javascript при вводе дробного числа с запятой будут определять подобный ввод как ошибку. Например, у нас есть следующая модель:

public class Book
{
    [Required]
    [Display(Name = "Название")]
    public string Name { get; set; }

	[Required]
    [Display(Name = "Цена")]
    [Range(typeof(decimal),"5,0", "1000,6", ErrorMessage = "Наименьшая цена - 5 рублей, в качестве разделителя дробной и целой части используется запятая")]
    public decimal Price { get; set; } // цена 
}

И представляение для создания объекта данной модели:

@model CustomProj.Models.Book
@{
    ViewBag.Title = "Добавить книгу";
}

@using (Html.BeginForm())
{
   @Html.ValidationSummary(true)
   @Html.AntiForgeryToken()
    <fieldset>
        <legend>Новая книга</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Price)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Price)
            @Html.ValidationMessageFor(model => model.Price)
        </div>

        <p>
            <input type="submit" value="Добавить" />
        </p>
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

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

Решение 1

Чтобы числа с запятой нормально валидировались, нам надо изменить секцию скриптов в представлении следующим образом:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
	<script>
	// переопределение валидации на стороне клиента
	$.validator.methods.range = function (value, element, param) {
		var globalizedValue = value.replace(",", ".");
		return this.optional(element) || (globalizedValue >= param[0] && globalizedValue <= param[1]);
	}

	$.validator.methods.number = function (value, element) {
		return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value);
	}
	</script>
}

С помощью данного кода javascript мы переопределяем действие библиотеки jquery.validate.js. Поэтому данный код следует помещать после включения данной библиотеки.

Решение 2

Мы решили по каким-то причинам отказаться от запятой в качестве разделителя и хотим использовать точку. В этом случае нам надо явно задать англоязычную культуру для приложения. Для этого переходим к файлу web.config в нашем проекте и добавляем в секцию system.web следующее определение культуры:

<globalization culture="en-US" uiCulture="en" />

Соответственно также нам надо будет в атрибуте Range устанавливать числа не с запятой, а с точкой: [Range(typeof(decimal),"5.0", "100.6", ErrorMessage = "Наименьшая цена - 5 рублей"]

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850