【问题标题】:Convert string to double: input string was not in a correct format将字符串转换为双精度:输入字符串的格式不正确
【发布时间】:2013-09-23 00:18:53
【问题描述】:

我通过串口从我的 Arduino 获取一些值。数据具有以下格式: "value1,value2,value3\r" 作为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;

}

【问题讨论】:

  • 你在这里滥用了相当多的 Substring,string.Split(',')TryParse 有什么问题?
  • 此代码适用于您的示例数据。请提供导致错误的数据
  • 您确定您的输入是4.5,550.0,0.02\r 而不是4.5,550.0,0.02\\r
  • @user2790895 遇到异常时能否给我们data 的值?
  • 由于有些人没有意识到这一点 - 示例数据在某些区域设置上失败,例如波兰语使用“,”作为小数点,并且不认为“4.5”是要转换的正确字符串。

标签: c# string winforms exception double


【解决方案1】:

这里有两个问题。首先,由于区域设置(无效的小数点字符),转换可能会失败,因此请使用来自System.Globalization 命名空间的CultureInfo.InvariantCulture 作为附加参数。第二件事,您要从子字符串中删除一个字符,因此请删除 -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);

【讨论】:

  • 关于切断最后一个字符的好通知。这可能是错误的原因
  • 对,修复了我的答案,因为它确实会影响转换。尽管如此,如果用户的区域设置无法识别“。”,则应该存在 CultureInfo 设置。作为小数点。
【解决方案2】:

\r 字符可能导致问题。尝试在处理之前对其进行修剪。

【讨论】:

    【解决方案3】:

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

    尝试在转换中指定 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];
    

    【讨论】:

    • 应该是对问题的评论,而不是对错误原因的回答
    • 它也可能在0.02\r上失败
    【解决方案4】:

    试试这个分割你的字符串

     string[] separotrs = { ",", "\r" };
     string[] result= aurdino.Split(separotrs, StringSplitOptions.RemoveEmptyEntries);
    
           double batteryVoltage = Convert.ToDouble(result[1]); //Sorry if order is incorrect:-)
           double v0 = Convert.ToDouble(result[0]);
           double I = Convert.ToDouble(result[2]);
    

    我没有得到的一件事是你到底在哪里出错但是你的方法不会获取正确的数字(切断最后一个值),你的变量 i (Current) 将获取0.02\r 将由 Convert.ToDouble 处理,您将获得 0.02 作为您的当前值,但是其他值将是错误的,但我认为您不会根据您的示例在此方法上遇到错误。

    【讨论】:

      猜你喜欢
      • 2014-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多