用点解析双精度为逗号

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# 将字符串转换为双精度/十进制并返回字符串,保留尾随零,为千位添加逗号

使用逗号时将字符串转换为双精度

逗号与双精度点与访问数据库

在Java中将双精度格式设置为两位小数会产生逗号而不是点[重复]

使用 fscanf 读取逗号分隔的双精度