我尝试使用后端R和使用R.NET连接器前端C#创建项目。 我想将DataTable转换为List,然后将其转换为NumericMatrix,因为R无法处理DataTable。
但是当到达以下行时:
double r = Convert.ToDouble(row);
我发现了这个错误:
输入字符串的格式不正确。
这是我的代码:
NumericMatrix matadata;
int nkolom = dataawal.Columns.Count;
if (nkolom > 1)
{
for (int j = 1; j < nkolom; j++)
{
int kol = dataawal.Columns[j].Ordinal;
List<double> s = new List<double>();
for (int i = 0; i < dataawal.Rows.Count; i++)
{
String row = dataawal.Rows[i].ItemArray[kol].ToString();
if (String.IsNullOrEmpty(row))
{
break;
}
else
{
double r = Convert.ToDouble(row); // NOTE Error comes here!
s.Add(r);
}
}
String nokol = Convert.ToString(j + 1);
NumericVector v = engine.CreateNumericVector(s);
engine.SetSymbol("dum", v);
matadata = engine.Evaluate("matdt=matrix(cbind(matdt,dum),ncol=" + nokol + ")").AsNumericMatrix();
}
}
答案 0 :(得分:0)
通常,当您不确定表示double值的字符串值的正确性时,您应该求助于double.TryParse。如果字符串无法被识别为有效的double,则此方法不会抛出异常,而是返回false,并且您可以跳过(或假设为零)有问题的行。
像这样的东西
...
else
{
double r;
// if tryparse returns true then r has received the converted value
if(double.TryParse(row, out r))
s.Add(r);
}
...
但是,您可能会遇到其他问题,例如值是有效的double,但表示的十进制格式对您当前的区域设置无效。在这种情况下,您需要一个不同形式的double.TryParse。也接受实现IFormatProvider
接口的类的实例的那个。
例如,假设您想要使用it-IT
语言环境(其中逗号用小数界定整数部分)来格式化您的双打,那么您应该使用
CultureInfo ci = new CultureInfo("it-IT");
...
else
{
double r;
if(double.TryParse(row, NumberStyles.AllowDecimalPoint, ci, out r))
s.Add(r);
}
...