C#使用DisplayFormat不修改区域设置将小数逗号改为小数点
解决方案
原配置不生效的原因
DisplayFormat的DataFormatString中,.和,属于格式说明符,而非字面量:
.会被自动替换为当前线程文化对应的小数点符号,会被自动替换为当前线程文化对应的千位分隔符
所以你直接写这两个符号会被当前系统文化的设置覆盖,无法实现硬编码小数点的效果。
可选解决方案
方案1:单字段指定硬编码格式(无需修改全局配置)
在格式串中把需要强制显示为小数点的.用单引号包裹,标识为字面量,不会被文化设置替换:
[DisplayFormat(DataFormatString = "{0:$###'.'###}")] public double Number { get; set; } // 如需保留固定小数位,可参考以下写法: [DisplayFormat(DataFormatString = "{0:$0'.'000}")] public double Number { get; set; }
注意:DisplayFormat特性仅在使用@Html.DisplayFor()等ASP.NET Core内置显示辅助方法时自动生效,手动调用ToString()时不生效。
方案2:手动格式化时指定固定文化
如果是手动调用ToString()输出数值,直接传入固定的不变文化即可,不受系统文化设置影响:
// 输出示例:$123.456 var displayStr = Number.ToString("$###.###", CultureInfo.InvariantCulture);
方案3:全局统一修改数字分隔符(不改变其他文化配置)
如果需要项目内所有数值的小数分隔符都默认用小数点,可在Startup.cs中修改当前文化的数字格式配置,仅修改分隔符,其他文化相关设置(如日期格式、界面语言)保持不变:
首先在ConfigureServices方法中添加配置:
public void ConfigureServices(IServiceCollection services) { // 其他服务配置... services.Configure<RequestLocalizationOptions>(options => { var currentCulture = CultureInfo.CurrentCulture.Clone() as CultureInfo; // 强制设置数字和货币的小数分隔符为小数点 currentCulture.NumberFormat.NumberDecimalSeparator = "."; currentCulture.NumberFormat.CurrencyDecimalSeparator = "."; options.DefaultRequestCulture = new RequestCulture(currentCulture); options.SupportedCultures = new List<CultureInfo> { currentCulture }; options.SupportedUICultures = new List<CultureInfo> { currentCulture }; }); }
然后在Configure方法中启用请求本地化配置:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 放在中间件管道最开头 app.UseRequestLocalization(); // 其他中间件配置... }
内容的提问来源于stack exchange,提问作者Tobi
相关产品推荐
相关产品推荐

