将带点的双精度解析为逗号
Parsing double with dot to comma
我正在和双打一起工作。在荷兰,我们使用 51,3 而不是 51.3。我确实写了一段使用点而不是逗号的代码。但是前面写的代码的结果 returns 是双倍的英文方式,带一个点。我遇到了一些奇怪的错误。
这是我的资料:
var calResult = 15.2d;
var calResultString = calResult.ToString(CultureInfo.GetCultureInfo("nl-NL"));
var result = double.Parse(calResultString);
- calResult == "15.2" -> 符合预期
- calResultString == "15,2" -> 符合预期
- result == "152" -> 这里我希望有一个逗号。
A 也尝试在 double.Parse 中添加文化信息。这导致了“15.2”。
TLDR:我需要将 English/American double 转换为 Dutch(或类似规则)double。
提前致谢! :)
P.S
我希望这不是一个重复的问题,但没有发现任何如此具体的问题。
您可能应该在使用荷兰文化时提供 "nl-NL"
var calResult = 15.2d;
var calResultString = calResult.ToString(CultureInfo.GetCultureInfo("nl-NL"));
// We should parse with "nl-NL", not with CurrentCulture which seems to be "en-US"
var result = double.Parse(calResultString, CultureInfo.GetCultureInfo("nl-NL"));
或指定CurrentCulture
(默认文化)
CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("nl-NL");
var calResult = 15.2d;
// now CultureInfo.GetCultureInfo("nl-NL") is redundant
var calResultString = calResult.ToString();
var result = double.Parse(calResultString);
最后,如果您有一个 string
表示 en-US
文化中的一些 浮点值 ,并且您想要 相同value 但必须是 nl-NL
格式的 string
:
string source = "123.456";
string result = double
.Parse(source, CultureInfo.GetCultureInfo("en-US"))
.ToString(CultureInfo.GetCultureInfo("nl-NL"));
数字和字符串不包含任何文化信息,而是在数字和字符串之间转换时指定文化。
result == "152" -> here I expect a comma
实际情况是您要求操作系统将“15,2”解析为双精度数,但未指定区域性。它默认为美国文化并忽略了逗号。
如果您指定了文化:
var result = double.Parse(calResultString, CultureInfo.GetCultureInfo("nl-NL"));
它会给你正确的值 (15.2),如果你的计算机配置为正确的数字格式(并且调试器使用了你的首选项),它甚至可能显示为 15,2。
理想情况下,您不要对文化进行硬编码,而是使用用户选择的文化。
我编写了一个简单的方法来检查输入中的逗号字符并将其替换为点。我认为最好的方法是将输入作为 string
值。这样你就可以操纵它,然后你可以解析它,如果你愿意,可以 return 一个双精度或一个字符串:
var input = Console.ReadLine();
double parsedDouble;
if (input.Contains(","))
{
input = input.ToString().Replace(",", ".");
}
if (!Double.TryParse(input, out parsedDouble))
{
Console.WriteLine("Error parsing input");
}
else
{
Console.WriteLine(parsedDouble);
}
Console.ReadLine();
编辑:Robin Bennett/Dmitry Bychenko 的回答比我的要好得多,因为我的回答更加手动。我不知道他提供的 parse
过载。
我会留下我的解决方案,因为它确实解决了这个问题,即使它更……粗鲁;)
var calResult = 15.2d;
var calResultString = calResult.ToString();
string result = double.Parse(calResultString).ToString(CultureInfo.GetCultureInfo("nl-NL"));
我正在和双打一起工作。在荷兰,我们使用 51,3 而不是 51.3。我确实写了一段使用点而不是逗号的代码。但是前面写的代码的结果 returns 是双倍的英文方式,带一个点。我遇到了一些奇怪的错误。
这是我的资料:
var calResult = 15.2d;
var calResultString = calResult.ToString(CultureInfo.GetCultureInfo("nl-NL"));
var result = double.Parse(calResultString);
- calResult == "15.2" -> 符合预期
- calResultString == "15,2" -> 符合预期
- result == "152" -> 这里我希望有一个逗号。
A 也尝试在 double.Parse 中添加文化信息。这导致了“15.2”。
TLDR:我需要将 English/American double 转换为 Dutch(或类似规则)double。
提前致谢! :)
P.S
我希望这不是一个重复的问题,但没有发现任何如此具体的问题。
您可能应该在使用荷兰文化时提供 "nl-NL"
var calResult = 15.2d;
var calResultString = calResult.ToString(CultureInfo.GetCultureInfo("nl-NL"));
// We should parse with "nl-NL", not with CurrentCulture which seems to be "en-US"
var result = double.Parse(calResultString, CultureInfo.GetCultureInfo("nl-NL"));
或指定CurrentCulture
(默认文化)
CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("nl-NL");
var calResult = 15.2d;
// now CultureInfo.GetCultureInfo("nl-NL") is redundant
var calResultString = calResult.ToString();
var result = double.Parse(calResultString);
最后,如果您有一个 string
表示 en-US
文化中的一些 浮点值 ,并且您想要 相同value 但必须是 nl-NL
格式的 string
:
string source = "123.456";
string result = double
.Parse(source, CultureInfo.GetCultureInfo("en-US"))
.ToString(CultureInfo.GetCultureInfo("nl-NL"));
数字和字符串不包含任何文化信息,而是在数字和字符串之间转换时指定文化。
result == "152" -> here I expect a comma
实际情况是您要求操作系统将“15,2”解析为双精度数,但未指定区域性。它默认为美国文化并忽略了逗号。
如果您指定了文化:
var result = double.Parse(calResultString, CultureInfo.GetCultureInfo("nl-NL"));
它会给你正确的值 (15.2),如果你的计算机配置为正确的数字格式(并且调试器使用了你的首选项),它甚至可能显示为 15,2。
理想情况下,您不要对文化进行硬编码,而是使用用户选择的文化。
我编写了一个简单的方法来检查输入中的逗号字符并将其替换为点。我认为最好的方法是将输入作为 string
值。这样你就可以操纵它,然后你可以解析它,如果你愿意,可以 return 一个双精度或一个字符串:
var input = Console.ReadLine();
double parsedDouble;
if (input.Contains(","))
{
input = input.ToString().Replace(",", ".");
}
if (!Double.TryParse(input, out parsedDouble))
{
Console.WriteLine("Error parsing input");
}
else
{
Console.WriteLine(parsedDouble);
}
Console.ReadLine();
编辑:Robin Bennett/Dmitry Bychenko 的回答比我的要好得多,因为我的回答更加手动。我不知道他提供的 parse
过载。
我会留下我的解决方案,因为它确实解决了这个问题,即使它更……粗鲁;)
var calResult = 15.2d;
var calResultString = calResult.ToString();
string result = double.Parse(calResultString).ToString(CultureInfo.GetCultureInfo("nl-NL"));