在C#中将字符串数组转换为浮点数数组

3

当尝试运行此代码时,我们遇到了一个错误。理想情况下,更改e.Message的数据类型从stringdoublefloat array。请帮助我们理解这个错误的含义,或者如何调试代码。

我们还尝试了float.Parse(e.Message, CultureInfo.InvariantCulture.NumberFormat);方法,但也出现了错误。

private void ClientReceiveData(object sender, ConnectedClient.NetDataEventArgs e)
{
    if (string.IsNullOrEmpty(e.Message) == false)
    {
        if (e.ID == 0)
        {
            //float.Parse(e.Message, CultureInfo.InvariantCulture.NumberFormat);
            Array.ConvertAll(e.Message.Split(','), Double.Parse);
            Trace.WriteLine(String.Join(Environment.NewLine, e.Message));
        }

        if (e.ID == 1)
        {
            //float.Parse(e.Message, CultureInfo.InvariantCulture.NumberFormat);
            Array.ConvertAll(e.Message.Split(','), Double.Parse);
            Trace.WriteLine(String.Join(Environment.NewLine, e.Message));
        }
    }

输入 (e.Message):

0.0160163, -0.3207418, -0.2747217, 0.9856872, -0.3428816, 0.02380935, 0.8472792, -0.3562718, 0.3080477, 0.6931204, -0.4135765, 0.2335226, 0.6617407, -0.2861188, 0.278595, 0.685502, -0.3337714, 0.06315409, 0.5661756, -0.5338272, 0.1274863, 0.6014508, -0.6020046, 0.149146, 0.6165056, -0.2287867, 0.108688, 0.753313, -0.2801398, 0.1555204, 0.5711947, -0.4046459, 0.3197014, 0.6477473, -0.4134837, 0.3147845, 0.6426268, -0.3393434, -0.242843, 0.9667573, -0.3945386, -0.2511228, 0.5462032, -0.4459318, -0.2613428, 0.2010812, -0.43355, -0.2804166, 0.09203719, -0.2818186, -0.2890762, 0.9426621, -0.2850094, -0.2625419, 0.5789056, -0.2990395, -0.2414854, 0.1805503, -0.2872439, -0.2554213, 0.06843466, -0.3543724, 0.2399589, 0.7335942, -0.5984071, 0.1476627, 0.6094998, -0.5848852, 0.1458522, 0.6007382, -0.4560334, 0.3629844, 0.6141819, -0.4130909, 0.2523528, 0.57725,

error


3
请将 e.Message 的全部内容以纯文本形式粘贴。里面可能有一些不被接受的内容,而我们无法看到全部内容。 - Paul Abbott
5
顺便提一句,ConvertAll 方法会返回一个新数组,如果你没有将输出结果赋值给任何变量,它就没有什么用处了。 - Crowcoder
4
你的代码末尾有一个逗号,导致在使用split函数时出现了一个空条目。使用RemoveEmptyEntries选项可以解决这个问题。这是为什么我们不建议使用错误信息的截图作为提问方式的好例子。 - Paul Abbott
1
@JayTailor 后置注释很可能是问题所在,添加选项 StringSplitOptions.RemoveEmptyEntries - D Stanley
是的,我添加了那个并且现在它可以工作了!谢谢大家! - Jay Tailor
显示剩余4条评论
2个回答

8
最后一个条目是一个空字符串,它不能使用Double.Parse解析。您可以使用:
var parsed = Array.ConvertAll(
    e.Message.Split(new[] { ',', }, StringSplitOptions.RemoveEmptyEntries),
    Double.Parse);

同时请注意,Double.Parse 方法依赖于当前的 CultureInfo 来解释字符串中的点号 .


那得视情况而定。如果事件处理方法需要运行两次才能找到“向量和”final,您可以将double[] answer;double[] result;作为__字段__(即类级别的变量,在方法外部)存在。然后在这两个字段都被赋值之后,您可以从中计算出final - Jeppe Stig Nielsen

1
你需要能够捕获有问题的值,并应忽略像尾随逗号创建的“空”条目:
private void ClientReceiveData(object sender, ConnectedClient.NetDataEventArgs e)
{
    double[] result = null; 
    if (string.IsNullOrEmpty(e.Message) == false)
    {
        if (e.ID == 0)
        {
            //float.Parse(e.Message, CultureInfo.InvariantCulture.NumberFormat);
            result = Array.ConvertAll(e.Message.Split(new [] {','}, StringSplitOptions.RemoveEmptyEntries), ParseWithError);
            Trace.WriteLine(String.Join(Environment.NewLine, e.Message));
        }

        if (e.ID == 1)
        {
            //float.Parse(e.Message, CultureInfo.InvariantCulture.NumberFormat);
            result = Array.ConvertAll(e.Message.Split( new [] {','}, StringSplitOptions.RemoveEmptyEntries), ParseWithError);
            Trace.WriteLine(String.Join(Environment.NewLine, e.Message));
        }
    }
}

double ParseWithError(string value) 
{
     double result;
     if (!double.TryParse(value, out result))
     {
         throw new ApplicationException("Error parsing value " + value,e);
     }
     return result;
}

在我看来更好的方式是:double ParseWithError(string value) { if (double.TryParse(value, out var dbl)) { return dbl; } throw new ApplicationException("解析值 " + value + " 时出错"); } - Jeppe Stig Nielsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接