我已经搜索了我的问题,但我没有成功,这就是我在这里的原因。
我想做的就是读取像“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操作系统。
提前谢谢。
答案 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可能不是.
(点)。这就是为什么您无法使用.
解析字符串作为日期分隔符的原因。
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);
如果您希望用户以本地格式输入值 - 您的代码很好,但要么是您对本地格式的期望"是错的,或者"当前的文化"设置不正确。