将字符串转换为双精度时出现奇怪的输出

本文关键字:输出 字符串 转换 双精度 | 更新日期: 2023-09-27 17:59:00

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

我所要做的就是读取一个类似"3.14"的字符串,并将其转换为双精度。说得够多了。。。这是我的代码:

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?

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

将字符串转换为双精度时出现奇怪的输出

尝试将区域性指定为Invariant:

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

您的区域性的小数分隔符似乎是逗号而不是,因此在转换后会截断dot

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

以下是它的实施方式;

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

很可能您的CurrentCultureNumberFormatInfo.NumberDecimalSeparator属性不是.(点)。这就是为什么不能将.作为日期分隔符来解析字符串的原因。

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);

根据我的结果判断,您所处的区域性区域中逗号是正常的十进制分隔符。此外,我认为您希望点和逗号都用于小数分隔。如果没有,则以下不是正确的解决方案。

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

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

这意味着点和逗号都被用作逗号,因此被解析为十进制分隔符。

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

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

为了完整起见,下面的示例显示了使用numberformatinfo将点设置为十进制分隔符,以及将逗号替换为点,因此这两个字符都用于十进制

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

不同的.Net区域性(国家/地区)有不同的十进制分隔符。

如果您希望输入值采用某种特定的格式,请使用某种特定的区域性或InvariantCulture。也可以考虑使用double。按原样解析在解析值方面比一般Convert.ToDouble具有更大的灵活性。

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

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