我需要将字符串转换为double。或漂浮,无论什么最适合这种类型的转换。
字符串是" 25.00"。
我如何转换此字符串以便在计算中使用它?
我试过了:
string s1 = "2";
string s2 = "25.00";
double d1 = Convert.ToDouble(s1);
double d2 = Convert.ToDouble(s2);
double d3 = d2 * d1;
我也试过这个:
string s1 = "2";
string s2 = "25.00";
double d1 = double.Parse(s1);
double d2 = double.Parse(s2);
double d3 = d2 * d1;
和
string s1 = "2";
string s2 = "25.00";
float f1 = float.Parse(s1);
float f2 = float.Parse(s2);
float f3 = f2 * f1;
这些似乎都不起作用,我得到了一个形式感觉。
答案 0 :(得分:5)
我怀疑您的默认文化信息使用逗号作为小数点分隔符而不是点。如果您知道您的输入将有一个点,那么最好明确指定不变文化:
double d1 = double.Parse(s1, CultureInfo.InvariantCulture);
double d2 = double.Parse(s2, CultureInfo.InvariantCulture);
但是,如果十进制值很重要,您应该考虑使用decimal
而不是float
或double
:
decimal d1 = decimal.Parse(s1, CultureInfo.InvariantCulture);
decimal d2 = decimal.Parse(s2, CultureInfo.InvariantCulture);
答案 1 :(得分:4)
如果您收到格式异常,则表示您运行代码的文化不会使用.
字符作为其小数分隔符。你可以做几件事:
.
字符作为其小数点分隔符.
字符
IFormatProvider
实例到目前为止,我认为第三种选择是最好的。它允许您指定解析方法所期望的格式。 CultureInfo
类实现IFormatProvider
接口。在您的代码中,您希望.
字符为小数分隔符。在几种文化中都是如此,但您最安全的选择可能是InvariantCulture
。
您可以按如下方式修改代码:
string s1 = "2";
string s2 = "25.00";
double d1 = Convert.ToDouble(s1, CultureInfo.InvariantCulture);
double d2 = Convert.ToDouble(s2, CultureInfo.InvariantCulture);
double d3 = d2 * d1;
string s1 = "2";
string s2 = "25.00";
double d1 = double.Parse(s1, CultureInfo.InvariantCulture);
double d2 = double.Parse(s2, CultureInfo.InvariantCulture);
double d3 = d2 * d1;
string s1 = "2";
string s2 = "25.00";
float f1 = float.Parse(s1, CultureInfo.InvariantCulture);
float f2 = float.Parse(s2, CultureInfo.InvariantCulture);
float f3 = f2 * f1;
此处,CultureInfo
班级' NumberFormat
属性用于确定将字符串解析为double
或float
时使用的小数分隔符。
我创建了一个.NET小提琴,向您展示它的工作原理:https://dotnetfiddle.net/Z5HB4T
您可以使用NumberDecimalSeparator
CultureInfo
属性的NumberFormat
属性查看特定区域性的小数点分隔符:
// Returns: "."
CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator;
// Outputs: "."
new CultureInfo("en-US").NumberFormat.NumberDecimalSeparator;
// Returns: ","
new CultureInfo("nl-NL").NumberFormat.NumberDecimalSeparator;
// Returns: "<depends on what is set as the current culture>"
CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
请参阅:https://dotnetfiddle.net/nSbYoP
有趣的是,NumberFormat
属性的类型为NumberFormatInfo
,它还实现了IFormatProvider
!这意味着您还可以将NumberFormatInfo
实例传递给解析方法。这允许您完全根据自己的喜好创建数字格式。然后,我们可以使用我们喜欢的任何十进制数字分隔符以下示例将十进制数分隔符更改为#
字符:
var numberFormatInfo = new NumberFormatInfo();
numberFormatInfo.NumberDecimalSeparator = "#";
string s1 = "2";
string s2 = "25#00";
double d1 = Convert.ToDouble(s1, numberFormatInfo);
double d2 = Convert.ToDouble(s2, numberFormatInfo);
double d3 = d2 * d1;
请参阅:https://dotnetfiddle.net/h6ex2Z
这种方法让您可以完全自由地理解解析数字的解析方法。
答案 2 :(得分:0)
有时当您将字符串“4.1”转换为双倍时,转换将为您提供41,为此您可以轻松修复替换“。”用“,” EJ: double ress = Convert.toDouble(“4.1”.replace(“。”,“,”);