У меня есть приложение ASP.NET MVC, которое должно работать на английском и немецком языках. В одном из моих представлений пользователь вводит десятичное значение и значение даты/времени.
// 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 в разных культурах?
Когда приведенный выше код работает в английской культуре, строка Decimal.TryParse возвращает false
Поскольку вы используете побитовое И с оператором &
и NumberStyles.AllowDecimalPoint & NumberStyles.AllowThousands
генерирует NumberStyles.None
который не указывает на стиль для вашего элемента. Из документации;
Указывает, что в анализируемой строке не могут присутствовать элементы стиля, такие как начальное или конечное пустое пространство, разделители тысяч или разделитель десятичных чисел. Строка, подлежащая анализу, должна состоять только из целочисленных десятичных цифр.
Если вы измените &
на |
ваш Decimal.TryParse
возвращает true
.
Когда код работает в немецкой культуре, обе строки Decimal.TryParse и DateTime.TryParse возвращают false.
То же самое для метода Decimal.TryParse
. НО, de-DE
культура ,
а не .
как NumberDecimalSeparator
. Но это так .
как NumberGroupSeparator
, почему он анализирует ваше значение 1.23
как 123
. Он считает, что это разделитель тысяч, а не десятичный разделитель.
Для вашего метода DateTime.TryParse
, так как вы не сказали нам, что такое saleDate
, похоже, что это не стандартный формат даты и времени для CurrentCulture
, поэтому он возвращает false
.
Если вы имеете в виду date
вместо saleDate
, это означает, что MM/dd/yyyy
не является стандартным форматом даты и времени для вашего CurrentCulture
и ни для культуры de-DE
.
Вы можете использовать метод DateTime.TryParseExact
или DateTime.ParseExact
(предпочтительный) с культурой, которая имеет /
как DateSeparator
например InvariantCulture
;
string date = "03/23/2015";
DateTime dt;
if(DateTime.TryParseExact(date, "MM/dd/yyyy", CultureInfo.InvariantCulture,
DateTimeStyles.None, out dt))
{
model.Date = dateValue;
}
Вы не должны использовать InvariantCulture
для этого. Вы должны синтаксический анализ с использованием одной культуры за раз, а затем попытки другого, если это не удается.