在.NET中解析文化特定的Decimal和DateTime值

时间:2015-03-30 12:07:32

标签: c# asp.net datetime decimal

我有一个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.TryParseDateTime.TryParse行都会返回false。我究竟做错了什么?如何跨文化解析Decimal和DateTime值?

2 个答案:

答案 0 :(得分:3)

  

当上述代码在英文文化中运行时,Decimal.TryParse   line返回false

因为您使用按位AND与& operatorNumberStyles.AllowDecimalPoint & NumberStyles.AllowThousands生成NumberStyles.None,表示您的元素没有样式。来自documentation;

  

表示没有样式元素,例如前导或尾随白色   可以存在空格,千位分隔符或小数分隔符   解析后的字符串。 要解析的字符串必须包含整数   仅十进制数字。

如果您将&更改为|,则Decimal.TryParse会返回true

  

当代码在德国文化中运行时,都是Decimal.TryParse   和DateTime.TryParse行返回false。

Decimal.TryParse方法相同。 但是de-DE文化有,而不是. NumberDecimalSeparator。但它.NumberGroupSeparator,这就是为什么它将1.23值解析为123的原因。它认为这是一个千位分隔符,而不是小数分隔符。

对于您的DateTime.TryParse方法,由于您没有完全告诉我们saleDate是什么,看起来它不是您standard date and time formatCurrentCulture,这就是为什么它返回false

如果您的意思是date而非saleDate,则表示MM/dd/yyyy不是CurrentCulture的标准日期和时间格式,也不是de-DE文化的标准日期和时间格式。

您可以使用DateTime.TryParseExactDateTime.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;
}

答案 1 :(得分:0)

您不应该使用InvariantCulture。您应该一次解析1个文化,然后尝试另一个文化失败。