如何根据当前文化正确转换 Double 和 DateTime?

How to Convert Double and DateTime Correctly accordingly to Current Culture?

您好,在我的 excel 之类的应用程序中,我想转换许多值并对其进行验证。但是在转换 double 和 dateTime 时我面临一些严重的问题。以下代码片段适用于英语文化。但是当文化是德语时,我得到的文本是 24.3.2014。现在它被转换为 double 和 returns 一个 double 值,但我不希望它被转换为 double。有什么建议吗?

string Text= "24.03.2014";
CultureInfo ci = CultureInfo.CreateSpecificCulture("de-DE");
var numberformat = ci.NumberFormat;
double d;
DateTime date;
if (double.TryParse(Text, NumberStyles.Any, numberformat, out d))
{
    Console.WriteLine(d); //prints 24032014.0
}
else if (DateTime.TryParse(Text, numberformat, DateTimeStyles.None, out date))
{
    Console.WriteLine(date);
}

德语中的 .NumberGroupSeparator 而不是英语中的 NumberDecimalSeparator。它类似于使用 en 文化将 24,03,2014 解析为 double,这也会给出 24032014

参见:

var culture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(culture.NumberFormat.NumberDecimalSeparator + " " + culture.NumberFormat.NumberGroupSeparator);

culture = CultureInfo.GetCultureInfo("de-DE");
Console.WriteLine(culture.NumberFormat.NumberDecimalSeparator + " " + culture.NumberFormat.NumberGroupSeparator);

因此,如果您尝试在 double 之前解析 DateTime,您的代码应该可以工作。

CultureInfo ci = CultureInfo.CreateSpecificCulture("de-DE");
var numberformat = ci.NumberFormat;
double d;
DateTime date;
if (DateTime.TryParse(Text, numberformat, DateTimeStyles.None, out date))
{
    Console.WriteLine(date);
}
else if (double.TryParse(Text, NumberStyles.Any, numberformat, out d))
{
    Console.WriteLine(d); 
}