Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符串转换为双精度时的奇怪输出_C#_String_Double - Fatal编程技术网

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

C# 将字符串转换为双精度时的奇怪输出,c#,string,double,C#,String,Double,我已经找到了我的问题,但我没有成功,这就是我来这里的原因 我只想读一个字符串,比如“3.14”,然后把它转换成double。 说够了。。。这是我的密码: using System; namespace GlazerCalcApplication { class MainClass { public static void Main (string[] args) { string heightString;

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

我只想读一个字符串,比如“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操作系统。
提前感谢。

根据结果判断,我认为您处于一个文化区,逗号是正常的小数分隔符。 另外,我认为您希望同时使用点和逗号来分隔小数。 如果不是,则以下不是正确的解决方案

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

height = Convert.ToDouble(heightString.Replace('.', ',');
这意味着点和逗号都用作逗号,因此解析为十进制分隔符

如果只想使用点作为分隔符,可以使用不变量区域性或特定的numberformatinfo。其他帖子中已经显示了不变的区域性。numberformat信息示例:

    var nfi = new NumberFormatInfo { NumberDecimalSeparator = "." };
    height = double.Parse(heightString,nfi);
为了完整起见,下面的示例显示了使用numberformatinfo将点设置为十进制分隔符,以及将逗号替换为点,因此这两个字符都用于小数

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

尝试将区域性指定为不变量:

height = Convert.ToDouble(heightString,CultureInfo.InvariantCulture);
区域性的小数分隔符似乎是逗号而不是点,因此转换后点会被截断。

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

这是怎么回事

您的
CurrentCulture
可能不是
(点)。这就是为什么不能用
作为日期分隔符来解析字符串

举例说明

作为一种解决方案,您可以创建一个新的
CurrentCulture
引用,并将其属性分配为
like

double height;
CultureInfo c = new CultureInfo("de-DE");
c.NumberFormat.NumberDecimalSeparator = ".";
height = Convert.ToDouble("3.14", c);
不同的.Net区域性(国家)具有不同的小数分隔符

如果您希望输入值采用某种特定格式,请使用某种特定区域性或
不变量区域性
。也可以考虑使用它比解析通用代码<代码>转换时更灵活的值。ToDouble < /代码> ./P>
    var d = double.Parse(heightString, CultureInfo.InvariantCulture);

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

您的
当前区域性是什么?
?最后我发现de de:D+0:虽然大多数问题都有很好的细节,但我不同意用
替换分隔符,
:“1.500”与许多国家的“1.5”不同…@AlexeiLevenkov答案基于3,14工作,并使用手动输入。生活在荷兰,我们通常希望两个字符都用作十进制分隔符,因为我们的官方分隔符是逗号,但输入通常是用点(数字键盘)完成的,但如果您希望
始终解析为十进制分隔符,则没有指定区域性。。。我认识一些不住在荷兰的人:)…@AlexeiLevenkov没错,我不确定Orpo的意图。更改了帖子以表明我对他的期望。但是我必须说,对于手动输入,我已经做过几次了。简单地说,因为手动输入的金额从不包含组分隔符,只包含小数分隔符,但是是的,这指定了一个特定的用户组,具体的请求是这两个都被视为小数分隔符。(哇,别以为我在这么多地方写过单词分隔符:
.Dump()
方法是您的自定义扩展方法或标准库的一部分?好的,谢谢您提供这些信息。因为我来自C语言,所以我从来没有想过使用“,”作为分隔符。
double height;
CultureInfo c = new CultureInfo("de-DE");
c.NumberFormat.NumberDecimalSeparator = ".";
height = Convert.ToDouble("3.14", c);
    var d = double.Parse(heightString, CultureInfo.InvariantCulture);