我有一个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值?
答案 0 :(得分:3)
当上述代码在英文文化中运行时,Decimal.TryParse line返回false
因为您使用按位AND与&
operator和NumberStyles.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 format的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;
}
答案 1 :(得分:0)
您不应该使用InvariantCulture
。您应该一次解析1个文化,然后尝试另一个文化失败。