Синтаксический анализ значений десятичной дроби и даты / времени в .NET

1

У меня есть приложение 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 в разных культурах?

Теги:
datetime
decimal

2 ответа

3
Лучший ответ

Когда приведенный выше код работает в английской культуре, строка 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;
}
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню