2015-03-30 2 views
1

У меня есть приложение ASP.NET MVC, которое должно работать на английском и немецком языках. В одном из моих представлений пользователь вводит десятичное значение и значение даты/времени.Разбор значений культурной специфической десятичной и десятичной даты в .NET

// Get the price 
string price = "1.23"; 
decimal priceValue = 0; 
var allowedStyles = (NumberStyles.AllowDecimalPoint & NumberStyles.AllowThousands); 
if (Decimal.TryParse(price, allowedStyles, CultureInfo.InvariantCulture, out priceValue)) 
{ 
    model.Price = priceValue; 
} 
else 
    errors.Add("Please enter a valid price."); 

// Parse the date 
string date = "03/23/2015"; 
if (String.IsNullOrWhiteSpace(date) == false) 
{ 
    DateTime dateValue = DateTime.MinValue; 
    if (DateTime.TryParse(saleDate, out dateValue)) 
    { 
    model.Date = dateValue; 
    } 
    else 
    errors.Add("Please enter a valid date."); 
} 

Когда приведенный выше код работает в английской культуре, Decimal.TryParse линия возвращается false. Когда код работает в немецкой культуре, линии Decimal.TryParse и DateTime.TryParse возвращаются false. Что я делаю не так? Как я могу анализировать значения Decimal и DateTime в разных культурах?

ответ

3

Когда приведенный выше код работает в английской культуре, Decimal.TryParse линия возвращает ложь

Поскольку вы используете побитовое И с & operator и NumberStyles.AllowDecimalPoint & NumberStyles.AllowThousands генерирует NumberStyles.None, который указывает на отсутствие стиля для вашего элемента. От documentation;

Указывает, что никакие элементы стиля, такие как начальные или конечные белый пространство, разделители тысяч, или десятичный разделитель, не может присутствовать в разобранный строки. Строка, подлежащая анализу, должна состоять из целых десятичных цифр.

Если вы измените & на | вашего Decimal.TryParse возвращается true.

Когда код работает в немецкой культуре, оба Decimal.TryParse и DateTime.TryParse линия возвращает ложной.

То же самое для Decimal.TryParse способ. НО, de-DE культура имеет , вместо . как NumberDecimalSeparator. Но он имеет . как NumberGroupSeparator, поэтому он анализирует ваше значение 1.23 как 123. Он считает, что это разделитель тысяч, а не десятичный разделитель.

Для вашего метода DateTime.TryParse, так как вы не сказали нам, что saleDate точно, похоже, это не standard date and time format для вашего CurrentCulture, поэтому она возвращает false.

Если вы имеете в виду date вместо saleDate, это означает, что MM/dd/yyyy не стандартный формат даты и времени для вашего CurrentCulture и ни для de-DE культуры.

Вы можете использовать (предпочтительный) метод DateTime.TryParseExact или DateTime.ParseExact с культурой, которая имеет / в виде как InvariantCulture подобное;

string date = "03/23/2015"; 
DateTime dt; 
if(DateTime.TryParseExact(date, "MM/dd/yyyy", CultureInfo.InvariantCulture, 
          DateTimeStyles.None, out dt)) 
{ 
    model.Date = dateValue; 
} 
0

Вы не должны использовать InvariantCulture. Вы должны синтаксический анализ с использованием одной культуры за раз, а затем попытки другого, если это не удается.

Смежные вопросы