将字符串转换为double时的奇怪输出

时间:2014-04-19 20:50:22

标签: c# string double

我已经搜索了我的问题,但我没有成功,这就是我在这里的原因。

我想做的就是读取像“3.14”这样的字符串并将其转换为double。 够了......这是我的代码:

using System;

namespace GlazerCalcApplication
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            string heightString;
            double height;

            heightString = Console.ReadLine();
            height = Convert.ToDouble(heightString);
            Console.WriteLine(height);
        }
    }
}

输出:

3.14
314

Press any key to continue...

为什么我的双倍值不是3.14?

而不是Convert.ToDouble()我还尝试使用double.Parse(),但我收到了同样的行为。读取像3,14这样的字符串是没有问题的。 也许我还应该提一下,我使用MonoDevelop和Linux操作系统。 提前谢谢。

4 个答案:

答案 0 :(得分:3)

尝试将文化指定为不变量:

height = Convert.ToDouble(heightString,CultureInfo.InvariantCulture);

您的文化中的十进制分隔符似乎是逗号而不是 dot 因此 dot 在转换后被截断

答案 1 :(得分:3)

Convert.ToDouble(string)明确使用Double.Parse(string, CultureInfo.CurrentCulture)方法。

这是implemented;

的结果
public static double ToDouble(String value) {
    if (value == null)
        return 0;
    return Double.Parse(value, CultureInfo.CurrentCulture);
}

您的CurrentCulture NumberFormatInfo.NumberDecimalSeparator property可能不是.(点)。这就是为什么您无法使用.解析字符串作为日期分隔符的原因。

LINQPad;

中的示例
CultureInfo c = new CultureInfo("de-DE");
c.NumberFormat.NumberDecimalSeparator.Dump(); // Prints ,

作为一种解决方案,您可以为CurrentCulture创建一个新的引用,并将其NumberDecimalSeparator属性赋予.类似的内容;

double height;
CultureInfo c = new CultureInfo("de-DE");
c.NumberFormat.NumberDecimalSeparator = ".";
height = Convert.ToDouble("3.14", c);

答案 2 :(得分:2)

根据结果判断,我认为你是在一个文化区,其中逗号是正常的小数分隔符。 另外,我认为您希望 点和逗号用于小数分隔。 如果没有,以下不是正确的解决方案。

使用两者的最快解决方案是

height = Convert.ToDouble(heightString.Replace('.', ',');

这意味着点和逗号都用作逗号,因此解析为小数点分隔符。

如果您只想使用点作为分隔符,则可以使用 invariantculture 或特定的数字格式。不变文化已在其他帖子中显示。数字格式信息示例:

    var nfi = new NumberFormatInfo { NumberDecimalSeparator = "." };
    height = double.Parse(heightString,nfi);

为了完整性,下面的示例显示使用numberformatinfo将点设置为小数点分隔符,以及用点替换逗号,因此两个字符都用于小数

    var nfi = new NumberFormatInfo { NumberDecimalSeparator = "." };
    height = double.Parse(heightString.Replace(',', '.'),nfi);

答案 3 :(得分:1)

不同的.Net文化(国家/地区)有不同的小数分隔符。

如果您希望输入值采用某种特定格式 - 请使用某种特定文化或InvariantCulture。另外,请考虑使用double.Parse,因为它在解析值方面比通用Convert.ToDouble更具灵活性。

    var d = double.Parse(heightString, CultureInfo.InvariantCulture);

如果您希望用户以本地格式输入值 - 您的代码很好,但要么是您对本地格式的期望"是错的,或者"当前的文化"设置不正确。