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

EF6保存decimal至SQL Server时小数位丢失,求解决(区域文化问题)

解决ASP.NET Core MVC中Decimal属性因区域文化导致的数值解析错误

问题原因

荷兰区域文化(nl-NL)默认使用逗号作为小数分隔符,而你输入时采用了美式的点分隔符,ASP.NET Core默认模型绑定会按照服务器区域文化解析数值,导致4.4被错误识别为44(点被当作千分分隔符忽略,自动补0作为小数位)。

解决方案

1. 全局设置应用默认区域为美式英语(en-US)

在Program.cs中配置请求本地化,强制整个应用使用en-US文化处理数值解析:

// 配置支持的文化列表
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[]
    {
        new CultureInfo("en-US"),
        // 可选:保留荷兰语作为UI显示文化
        new CultureInfo("nl-NL")
    };

    options.DefaultRequestCulture = new RequestCulture("en-US");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;
});

// 启用本地化中间件(需放在UseRouting之后、UseAuthorization之前)
app.UseRequestLocalization();

2. 针对单个模型属性指定解析文化

如果不想全局修改区域设置,可在Driver模型的decimal属性上添加特性,强制该属性使用en-US文化解析:

public class Driver
{
    public int Id { get; set; }

    [Key]
    public string driverName { get; set; }

    [BindProperty(Culture = "en-US")]
    [DisplayFormat(DataFormatString = "{0:F1}", ApplyFormatInEditMode = true)]
    public decimal driverScore { get; set; }

    [BindProperty(Culture = "en-US")]
    [DisplayFormat(DataFormatString = "{0:F1}", ApplyFormatInEditMode = true)]
    public decimal employedTime { get; set; }

    // ... 其他属性 ...

    [BindProperty(Culture = "en-US")]
    [DisplayFormat(DataFormatString = "{0:F1}", ApplyFormatInEditMode = true)]
    public decimal lastEvaluated { get; set; }

    // ... 其他属性 ...
}

3. 验证EF6的数据库列配置

确保数据库中对应的decimal列确实是decimal(18,1)类型:

  • 检查迁移文件是否正确生成了列类型配置
  • 若迁移未生效,重新生成并更新数据库:
Add-Migration FixDecimalColumnType
Update-Database

4. 前端输入优化

在表单输入框中指定类型和语言属性,帮助浏览器正确处理数值输入:

<input type="number" step="0.1" lang="en" asp-for="driverScore" class="form-control" />

总结

优先使用全局区域配置,能一次性解决所有数值类型的解析问题;若需保留部分区域特性,再针对单个属性或页面做单独设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:55:28