将字符串转换为双精度或浮点c#

本文关键字:双精度 字符串 转换 | 更新日期: 2023-09-27 18:18:19

我需要将字符串转换为double。或者float,任何最适合这种类型的转换。

字符串为"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;

这些似乎都不起作用,我得到一个formatexception

将字符串转换为双精度或浮点c#

我怀疑您的默认区域性信息使用逗号作为小数分隔符而不是点。如果您知道您的输入将有一个点,那么最好显式地指定不变量区域性:

double d1 = double.Parse(s1, CultureInfo.InvariantCulture);
double d2 = double.Parse(s2, CultureInfo.InvariantCulture);

但是,如果十进制值很重要,则应该考虑使用decimal而不是floatdouble:

decimal d1 = decimal.Parse(s1, CultureInfo.InvariantCulture);
decimal d2 = decimal.Parse(s2, CultureInfo.InvariantCulture);

如果出现格式异常,则意味着正在其上运行代码的区域不使用.字符作为小数分隔符。有几件事你可以做:

  1. 将全局区域性更改为使用.字符作为小数分隔符的区域性
  2. 手动将.字符替换为区域的小数分隔符
  3. 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属性用于确定将字符串解析为doublefloat时使用的十进制分隔符。

我已经创建了一个。net Fiddle来展示它的工作原理:https://dotnetfiddle.net/Z5HB4T

您可以使用CultureInfoNumberFormat属性的NumberDecimalSeparator属性来查看特定区域性的小数分隔符:

// 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

这种方法给了你完全的自由来决定你想要的解析方法如何解释数字。

有时当你将字符串"4.1"转换为double时,你会得到41,因此你可以很容易地将"."替换为","ej:双靓= Convert.toDouble (.replace"4.1" (".",",");