用点解析双精度为逗号
Posted
技术标签:
【中文标题】用点解析双精度为逗号【英文标题】:Parsing double with dot to comma 【发布时间】:2019-10-16 09:17:34 【问题描述】:我正在使用双打。在荷兰,我们使用 51,3 而不是 51.3。我确实写了一段使用点而不是逗号的代码。但是之前编写的代码的结果返回了一个双倍的英文方式,带有一个点。我遇到了一些奇怪的错误。
这是我所拥有的:
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:我需要将英/美双精度转换为荷兰语(或类似规则)。
提前致谢! :)
附言
我希望这不是一个重复的问题,但没有找到任何具体的问题。
【问题讨论】:
我不明白这个问题。double
没有文化概念,没有所谓的“英美双标”。当您将 double
转换为字符串时,然后文化变得很重要,因为这决定了例如小数位使用什么字符。如果您在调试器中查看您的double
,请记住调试器正在使用某种文化为您将其转换为字符串。
var result = source.Parse(CultureInfo.GetCultureInfo("en-US")).ToString(CultureInfo.GetCultureInfo("nl-NL"));
有一个string
,它是en-US
中的一个浮点数,我们将它转换为一个string
,它代表相同的浮点数,但在nl-NL
中
如果你这样做var result = double.Parse(calResultString, CultureInfo.GetCultureInfo("nl-NL"));
会发生什么?
@Matthew "A 也确实尝试在 double.Parse 中添加cultureinfo。这导致了“15.2”。"
@Jeroen 如果您正在解析使用例如',' 作为小数点分隔符,double.Parse
需要知道这一点,才能正确解释。
【参考方案1】:
您可能应该在与荷兰文化合作时提供"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);
最后,如果您有一个代表en-US
文化中的一些浮点值的string
,并且您想要相同的值,但要成为string
nl-NL
格式:
string source = "123.456";
string result = double
.Parse(source, CultureInfo.GetCultureInfo("en-US"))
.ToString(CultureInfo.GetCultureInfo("nl-NL"));
【讨论】:
谢谢!我有一种错觉,有不同类型的双打,没有。但是你的解释很清楚(+ cmets under question)!【参考方案2】:数字和字符串不包含任何文化信息,而是在数字和字符串之间转换时指定文化。
result == "152" -> 这里我希望是逗号
发生的情况是您要求操作系统将“15,2”解析为双精度数,但没有指定文化。它默认为美国文化并忽略逗号。
如果您指定了文化:
var result = double.Parse(calResultString, CultureInfo.GetCultureInfo("nl-NL"));
它会为您提供正确的值 (15.2),如果您的计算机配置为正确的数字格式(并且调试器使用了您的偏好),它甚至可能显示为 15,2。
理想情况下,您不要对文化进行硬编码,而是使用用户选择的文化。
【讨论】:
【参考方案3】:我编写了一个简单的方法来检查输入中的逗号字符并将其替换为点。我相信最好的方法是将输入作为string
值。这样您就可以对其进行操作,然后您可以对其进行解析并根据需要返回一个双精度或字符串:
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
的过载。
我会留下我的解决方案,因为它确实解决了这个问题,即使它有点……粗鲁;)
【讨论】:
【参考方案4】: var calResult = 15.2d;
var calResultString = calResult.ToString();
string result = double.Parse(calResultString).ToString(CultureInfo.GetCultureInfo("nl-NL"));
【讨论】:
以上是关于用点解析双精度为逗号的主要内容,如果未能解决你的问题,请参考以下文章
C# 将字符串转换为双精度/十进制并返回字符串,保留尾随零,为千位添加逗号