输入字符串的格式不正确(双精度)

Input string was not in a correct format (double)

我正在尝试将字符串(例如“0.20055”)转换为其等效的双精度值。

我已经知道出于某种原因该字符串不包含有效的双精度值,但我不明白为什么。

我真的需要能够将此字符串转换为双精度...有人能解释一下为什么它不是有效的双精度吗?以及如何解决这个问题?

这是我的一些代码:

double[] values_in_double = null;
string[] values_in_string = lines[j].Split(',');
for(int x=0; x < numCols; x++)
{
    double val;
    bool r = double.TryParse(values_in_string[x],out val);
    if (!r)
        return;
    values_in_double[x] = Convert.ToDouble(values_in_string[x]);

}

如你所见,我有 string[] 行,其中一行是这样的:

0.20055,0.37951,0.39641,2.0472,32.351,0.38825,0.24976,1.3305,1.1389,0.50494

我把他们分开了。但随后我需要将每一个都转换为双精度值。

试试这个

Double.TryParse(values_in_string[x], NumberStyles.Any, CultureInfo.InvariantCulture, 输出值);

改变

double[] values_in_double = null;

    string[] values_in_string = lines[j].Split(',');

string[] values_in_string = lines[j].Split(',');
int arraySize = values_in_string.Length;
double[] values_in_double = new double[arraySize];

随您使用

double[] values_in_double = null;

并且无法将值分配给空数组

尝试更改行:

double[] values_in_double = null;

进入

double[] values_in_double = new double[numCols];

否则您提供的代码不会运行,因为数组未定义(不能为空)。

你遇到的问题是你的 PC 或服务器上的区域性定义,如果分隔符是“,”系统解释“。”作为一个字符。

这样使用:

        double vValue;
        string[] vValuesString = vLines[j].Split(',');
        double[] vValuesDouble = new double[vValuesString.Length];

        for (int x = 0; x < vValuesString.Length; x++)
            if (double.TryParse(vValuesString[x], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out vValue))
                return; 'or use' continue;'or use' vValuesDouble[x] = 0;
            else vValuesDouble[x] = vValue;

备注:

  • 实例化您的 'double[] vValuesDouble = new double[vValuesString.Length];',您不能将值赋给空数组。
  • 当您将输出变量 return 与将字符串转换为双精度的结果一起使用 TryParce 时,您无需再次重新转换它。
  • 永远不要在循环中声明变量,它会在每个 运行 循环中声明并实例化。
  • TryParce return 表示转换结果的 bool 值,您不需要声明和实例化一个 var,只需在 if 中使用它即可。
  • 使用一些协议来定义变量的名称。
  • 尽你所能恢复你的代码。
  • 我将整个 using System.Globalization 放在了前面,但您可以在顶部声明 using 或为整个应用程序定义 System.Globalization。
  • 最后,抱歉我的英语不是我的第一语言。

最佳。

我对您的代码所做的主要更改是

  1. 删除 return 语句,因为这会过早地退出我们的方法
  2. 使用 List<double> 来存储你的双打(你不必提前声明大小,这很好,因为我们不确定字符串中有多少项目会成功转换加倍)
  3. 在将 val 变量添加到 List 时使用它,因为 double.TryParse 已经为该变量赋值。

我还添加了一个检查以确保变量 numRows 不大于字符串数组,因为这会导致我们的循环出现异常:

// Mock values read from file
var input = new StringBuilder();
input.Append("0.20055,0.37951,0.39641,2.0472,32.351,0.38825,0.24976,1.3305‌​,");
input.Append("1.1389,0.50494,0.24‌​976,0.6598,0.1666,0.‌​24976,497.42,0.73378‌​,");
input.Append("2.6349,0.24976,0.14‌​942,43.37,1.2479,0.2‌​1402,0.11998,0.47706‌​,");
input.Append("‌​0.50494,0.60411,1.4‌​582,1.7615,5.9443,0.‌​11788,593.27,0.50‌​591,");
input.Append("0.12804,0.66295,0.14942,94.14,‌​3.8772,0.56393,0.214‌​02,1.741,");
input.Append("1.5‌​225,49.394,0.1853,0.‌​11085,2.042,0.051402,0.12804,114‌​.42,");
input.Append("71.05,1.0097,348690,0.12196,0.39‌​718,0.87804,0.37854,‌​0.25792,");
input.Append("2.2437,2.248‌​,0.001924‌​,8.416,5.1372,82.658‌​,4.4158,7.4277");

string[] values_in_string = inputString.ToString().Split(',');

// Declare values_in_double as a List so we don't have to worry about sizing
List<double> values_in_double = new List<double>();

// We will get errors if numCols is larger than our string array, so to be safe,
// set a variable that is the smallest of either numCols or our string array length
var numIterations = Math.Min(numCols, values_in_string.Length);

for (int x = 0; x < numIterations; x++)
{
    double val;

    // If TryParse succeeds, 'val' will contain the double value, so add it to our List
    if (double.TryParse(values_in_string[x], NumberStyles.Any, 
        System.Globalization.CultureInfo.InvariantCulture, out val))
    {
        values_in_double.Add(val);
    }
}

还有一种更短的方式来编写这段代码。该行基本上是说:对于 values_in_string 中的每个项目,其中 double.TryParse returns true、Select val(作为值的项目)和将所有 val 项目转换为 List:

string[] values_in_string = inputString.ToString().Split(',');
double val = 0;

List<double> values_in_double = values_in_string
    .Where(value => double.TryParse(value, NumberStyles.Any, 
        System.Globalization.CultureInfo.InvariantCulture, out val))
    .Select(v => val)
    .ToList();