输入字符串的格式不正确(双精度)
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。
- 最后,抱歉我的英语不是我的第一语言。
最佳。
我对您的代码所做的主要更改是
- 删除
return
语句,因为这会过早地退出我们的方法
- 使用
List<double>
来存储你的双打(你不必提前声明大小,这很好,因为我们不确定字符串中有多少项目会成功转换加倍)
- 在将
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.24976,0.6598,0.1666,0.24976,497.42,0.73378,");
input.Append("2.6349,0.24976,0.14942,43.37,1.2479,0.21402,0.11998,0.47706,");
input.Append("0.50494,0.60411,1.4582,1.7615,5.9443,0.11788,593.27,0.50591,");
input.Append("0.12804,0.66295,0.14942,94.14,3.8772,0.56393,0.21402,1.741,");
input.Append("1.5225,49.394,0.1853,0.11085,2.042,0.051402,0.12804,114.42,");
input.Append("71.05,1.0097,348690,0.12196,0.39718,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();
我正在尝试将字符串(例如“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。
- 最后,抱歉我的英语不是我的第一语言。
最佳。
我对您的代码所做的主要更改是
- 删除
return
语句,因为这会过早地退出我们的方法 - 使用
List<double>
来存储你的双打(你不必提前声明大小,这很好,因为我们不确定字符串中有多少项目会成功转换加倍) - 在将
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.24976,0.6598,0.1666,0.24976,497.42,0.73378,");
input.Append("2.6349,0.24976,0.14942,43.37,1.2479,0.21402,0.11998,0.47706,");
input.Append("0.50494,0.60411,1.4582,1.7615,5.9443,0.11788,593.27,0.50591,");
input.Append("0.12804,0.66295,0.14942,94.14,3.8772,0.56393,0.21402,1.741,");
input.Append("1.5225,49.394,0.1853,0.11085,2.042,0.051402,0.12804,114.42,");
input.Append("71.05,1.0097,348690,0.12196,0.39718,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();