You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中Convert.ToDouble转000.7字符串为double结果为7的异常问题

问题原因

Convert.ToDouble执行转换时默认使用当前线程的区域文化(CultureInfo)规则解析数字格式,这是异常的核心来源:

  • 大量非英语区域(如德语区、法语区等欧洲区域)的数字格式规则中,逗号,是小数分隔符,点号.是千位分隔符
  • 解析"000.7"这类字符串时,点号会被识别为千位分隔符直接忽略,字符串最终被解析为0007,也就是你观察到的输出值7。

DataGridView单元格未绑定强类型数字列、直接存储字符串值时,就会触发这个默认解析逻辑,且解析结果会随运行环境的区域设置变化,稳定性极差。

修复方案

解析固定以.作为小数分隔符的数字字符串时,不要依赖默认区域配置,显式指定解析规则即可。

  • 首先引入全局化命名空间:
using System.Globalization;
  • 转换时显式指定使用不变文化(该文化固定以.作为小数分隔符,不受系统区域设置影响),修改后的核心逻辑如下:
int rows = dataGridView1.RowCount;
int x;
double y;

for (int i = 0; i < rows; i++)
{
    x = Convert.ToInt32(dataGridView1.Rows[i].Cells[1].Value);
    // 指定InvariantCulture做解析,避免区域格式导致的转换错误
    y = Convert.ToDouble(dataGridView1.Rows[i].Cells[2].Value, CultureInfo.InvariantCulture);
    this.chartHorizontal.Series["Horizontal"].Points.AddXY(x, y);
}
  • (可选)更严谨的容错实现可以使用double.TryParse,避免单元格值为空、格式非法时直接抛出运行时异常:
for (int i = 0; i < rows; i++)
{
    if (!int.TryParse(dataGridView1.Rows[i].Cells[1].Value?.ToString(), out x))
    {
        // 此处可添加X轴数据格式错误的处理逻辑
        continue;
    }
    // 显式指定允许解析小数、前导零、前后空白字符,使用不变文化做匹配
    if (!double.TryParse(dataGridView1.Rows[i].Cells[2].Value?.ToString(), 
        NumberStyles.Float | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite,
        CultureInfo.InvariantCulture, 
        out y))
    {
        // 此处可添加Y轴数据格式错误的处理逻辑
        continue;
    }
    this.chartHorizontal.Series["Horizontal"].Points.AddXY(x, y);
}

内容的提问来源于stack exchange,提问作者ElectricRay81

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:27:09