我想将字符串转换为double。
以下是我所做的例子:
string line = "4.1;4.0;4.0;3.8;4.0;4.3;4.2;4.0;";
double[] values = line2.Split(';').Select(double.Parse).ToArray();
但是出现错误
输入字符串的格式不正确。
当我尝试
时string line2 = "1;2;3;4;5;6;7;8;9;10;11;12";
double[] values = line2.Split(';').Select(double.Parse).ToArray();
它完美无缺。
双值的输入格式应该是什么?
答案 0 :(得分:4)
您的问题是第一个输入中的最后一个分号。 double.Parse
方法正在传递一个空字符串。 double value2 = double.Parse("");
有几种方法可以解决这个问题,我将在此处概述两个方法:
检查输入中的最后一个字符是否为分号,如果是,则将其删除。 (这应该是自我解释的。)
使用StringSplitOptions.RemoveEmptyEntries
重载。
我更喜欢第二种选择,我自己。因为这也消除了连续两个分号的问题。
string line = "4.1;4.0;4.0;3.8;4.0;;4.3;4.2;4.0;";
double[] values = line.Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries).Select(double.Parse).ToArray();
此外,只是为了幽默这个想法,它也可能是一个文化问题;以下代码针对特定于文化的方案进行了调整。 if
检查的原因是节省计算时间。如果您愿意,可以将其删除,不会对整体影响造成伤害。 (这只是意味着程序将在具有文化集的计算机上运行程序的情况下用.
替换.
。这只是一个简单的优化。)
string line = "4.1;4.0;4.0;3.8;4.0;;4.3;4.2;4.0;";
if (CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator != ".")
line = line.Replace(".", CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
double[] values = line.Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries).Select(s => double.Parse(s)).ToArray();
关于文化问题可能性的另一个侧边栏:如果它 文化问题,那么该操作不会抛出异常,而是简单地返回数字的每个数字而不使用分隔符。 (即41, 40, 40, 38, 40, 43, 42, 40
)
其他选择:
请改用double.TryParse
。
使用自定义for
循环并手动解析数据。
我可能还有其他选择。
答案 1 :(得分:1)
另一种选择是对分割数组中的每个项目使用double.TryParse()
方法。这将确保在尝试将其添加到values
数组之前,数组中的每个项目(空或不是)都是有效的双重项。
例如:
string line = "4.1;4.0;4.0;3.8;4.0;4.3;4.2;4.0;";
double temp = 0;
double[] values = line.Split(';')
.Where(item => double.TryParse(item, out temp))
.Select(i => temp).ToArray();