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

MVC中Linq转换SQL时出现‘输入字符串格式不正确’错误求助

解决Linq中金额字符串转Double时的格式错误问题

你遇到的核心问题是amount字段为字符串类型,其中包含带千分位逗号(如3,200,000.00)、纯数字、高精度小数甚至负数,直接用Convert.ToDouble无法识别千分位分隔符,导致"输入字符串格式不正确"的报错。下面给你两个实用的解决方案:

方案1:自定义安全解析方法(适合内存中处理)

写一个专门的解析方法,覆盖所有格式的金额字符串,支持千分位、小数点和正负号:

using System.Globalization;

private static double ParseAmount(string amountStr)
{
    if (string.IsNullOrWhiteSpace(amountStr))
        return 0;

    // 配置支持的解析规则:允许千分位、小数点、正负号
    var numberStyles = NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign;
    if (double.TryParse(amountStr, numberStyles, CultureInfo.InvariantCulture, out double parsedValue))
    {
        return parsedValue;
    }

    // 转换失败时返回默认值,你也可以根据业务需求抛出异常
    return 0;
}

然后在Linq中调用这个方法,如果是EF Core需要先把数据拉到内存(注意数据量过大时的性能影响):

var result = dbContext.pmTA_OoeGeneralAppropriation
    .AsEnumerable() // 将数据加载到内存中处理
    .GroupBy(p => p.ooe_general_id)
    .Select(g => new
    {
        ooe_general_id = g.Key,
        totalAppro = g.Sum(p => ParseAmount(p.amount)),
        lastDate = g.Max(p => p.date)
    })
    .ToList();

方案2:模拟原始SQL的转换逻辑(适合EF翻译到SQL)

你的原始SQL用了CAST(CAST(amount AS money) AS float),这个逻辑会自动处理带千分位的字符串。在Linq中可以直接模拟这个过程,先将字符串转成decimal(对应SQL的money类型),再转成double:

using System.Globalization;

var result = dbContext.pmTA_OoeGeneralAppropriation
    .GroupBy(p => p.ooe_general_id)
    .Select(g => new
    {
        ooe_general_id = g.Key,
        totalAppro = g.Sum(p => Convert.ToDouble(Convert.ToDecimal(p.amount, CultureInfo.InvariantCulture))),
        lastDate = g.Max(p => p.date)
    })
    .ToList();

Convert.ToDecimal原生支持解析带千分位的字符串,指定CultureInfo.InvariantCulture可以避免系统区域设置的影响,确保在不同环境下都能正确解析。

方案说明

  • 方案1通过NumberStyles明确告知解析器支持的格式,完美覆盖你提到的所有场景(带逗号的金额、纯数字、小数、负数)。
  • 方案2完全对齐原始SQL的转换逻辑,利用SQL Server对money类型的解析能力,在数据库层面完成转换,再映射到C#的double类型。

内容的提问来源于stack exchange,提问作者John Clarence Castro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:55:52