将字符串拆分并转换为双精度 C#

问题描述 投票:0回答:3

我想将字符串转换为双精度。

这是我所做的示例:

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();

它工作得很好。

双值的输入格式应该是什么?

c# string split double
3个回答
6
投票

您的问题是第一个输入中的最后一个分号。向

double.Parse
方法传递一个空字符串。
double value2 = double.Parse("");
有多种方法可以解决此问题,我将在这里概述两种:

  1. 检查输入的最后一个字符是否是分号,如果是,则将其删除。 (这应该是不言自明的。)

  2. 使用

    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


其他选项:

    请使用
  1. double.TryParse

    代替。

    
    

  2. 使用自定义
  3. for

    循环并手动解析您的数据。

    
    

  4. 可能还有其他我想不到的选择。


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();



0
投票

Control Panel -> Clock and Region -> Region

将格式更改为
英语(国际)

double.Parse 根据本地文化设置解析数字。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.