Я пытаюсь понять, почему среда отказывается привязывать значение "1,234.00" к десятичной. Что может быть причиной этого?
Значения типа "123.00" или "123.0000" успешно свяжутся.
У меня есть следующий код, устанавливающий мою конфигурацию культуры в Global.asax
public void Application_AcquireRequestState(object sender, EventArgs e)
{
var culture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
culture.NumberFormat.NumberDecimalSeparator = culture.NumberFormat.CurrencyDecimalSeparator = culture.NumberFormat.PercentDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = culture.NumberFormat.CurrencyGroupSeparator = culture.NumberFormat.PercentGroupSeparator = ",";
Thread.CurrentThread.CurrentCulture = culture;
}
Французская культура устанавливается как культура по умолчанию в Web.Config
<globalization uiCulture="fr-FR" culture="fr-FR" />
Я погрузился в источники класса System.Web.Mvc.dll ValueProviderResult. Он использует System.ComponentModel.DecimalConverter.
converter.ConvertFrom((ITypeDescriptorContext) null, culture, value)
Здесь сообщение "1,234.0000 не является допустимым значением для десятичного числа". происходит от.
Я попытался запустить следующий код на своей игровой площадке:
static void Main()
{
var decConverter = TypeDescriptor.GetConverter(typeof(decimal));
var culture = new CultureInfo("fr-FR");
culture.NumberFormat.NumberDecimalSeparator = culture.NumberFormat.CurrencyDecimalSeparator = culture.NumberFormat.PercentDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = culture.NumberFormat.CurrencyGroupSeparator = culture.NumberFormat.PercentGroupSeparator = ",";
Thread.CurrentThread.CurrentCulture = culture;
var d1 = Decimal.Parse("1,232.000");
Console.Write("{0}", d1); // prints 1234.000
var d2 = decConverter.ConvertFrom((ITypeDescriptorContext)null, culture, "1,232.000"); // throws "1,234.0000 is not a valid value for Decimal."
Console.Write("{0}", d2);
}
DecimalConverter выбрасывает одно и то же исключение. Decimal.Parse правильно анализирует одну и ту же строку.