将字符串转换为double:输入字符串的格式不正确

Mic*_*ael 3 c# string double exception winforms

我通过串口从我的Arduino获得了一些值.数据的格式为: "value1,value2,value3\r"a string.

示例:"4.5,550.0,0.02\r"

我可以接收并分离值,但是当我尝试将它们转换为时,double我得到以下异常

"输入字符串的格式不正确"`.

double Battery = 0, Voltage = 0, Current = 0;

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    string data = serialPort1.ReadLine();
    string bv = data.Substring(0, data.IndexOf(",") - 1);
    data = data.Substring(data.IndexOf(",") + 1);
    string v0 = data.Substring(0, data.IndexOf(",") - 1);
    data = data.Substring(data.IndexOf(",") + 1);
    string i = data;

    double batteryVoltage = Convert.ToDouble(bv);
    double V0 = Convert.ToDouble(v0);
    double I = Convert.ToDouble(i);

    Battery = batteryVoltage;
    Voltage = V0;
    Current = I;

}
Run Code Online (Sandbox Code Playgroud)

S_F*_*S_F 7

这里有两件事是个问题.首先,转换可能失败,因为区域设置(无效小数点字符),因此使用CultureInfo.InvariantCultureSystem.Globalization命名空间作为附加参数.第二件事,你要从子串中切掉一个字符,所以删除-1.

string data = "4.5,550.0,0.02\r";
string bv = data.Substring(0, data.IndexOf(","));
data = data.Substring(data.IndexOf(",") + 1);
string v0 = data.Substring(0, data.IndexOf(","));
data = data.Substring(data.IndexOf(",") + 1);
string i = data;

double batteryVoltage = Convert.ToDouble(bv, CultureInfo.InvariantCulture);
double V0 = Convert.ToDouble(v0, CultureInfo.InvariantCulture);
double I = Convert.ToDouble(i, CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)


Rik*_*Rik 0

您的代码适用于我提供的示例输入。您能详细说明一下例外情况吗?

尝试在转换中指定 CultureInfo。

另外,您应该使用以下String.Split()方法:

string data = "4.5,550.0,0.02\r";
var strings = data.Split(',');
var doubles = strings.Select(s => Convert.ToDouble(s, CultureInfo.InvariantCulture)).ToList();

double batteryVoltage = doubles[0];
double V0 = doubles[1];
double I = doubles[2];
Run Code Online (Sandbox Code Playgroud)