将字符串转换为双精度时出现奇怪的输出
本文关键字:输出 字符串 转换 双精度 | 更新日期: 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);
}
很可能您的CurrentCulture
的NumberFormatInfo.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);
如果您希望用户以本地格式输入值,那么您的代码很好,但您对"本地格式"的期望是错误的,或者"当前区域性"设置不正确。