将字符串转换为双精度或浮点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
我怀疑您的默认区域性信息使用逗号作为小数分隔符而不是点。如果您知道您的输入将有一个点,那么最好显式地指定不变量区域性:
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);
如果出现格式异常,则意味着正在其上运行代码的区域不使用.
字符作为小数分隔符。有几件事你可以做:
- 将全局区域性更改为使用
.
字符作为小数分隔符的区域性 - 手动将
.
字符替换为区域的小数分隔符 - 在
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 Fiddle来展示它的工作原理:https://dotnetfiddle.net/Z5HB4T
您可以使用CultureInfo
的NumberFormat
属性的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" (".",",");