You need to enable JavaScript to run this app. 如何避免Razor View将decimal类型小数拆分为两个整数
优惠活动
大模型
产品
解决方案
定价
更多

如何避免Razor View将decimal类型小数拆分为两个整数

问题原因
  • 核心就是区域文化设置导致的:ASP.NET 渲染C#数值类型到前端时,默认会用当前生效的区域文化做格式化,部分区域的小数分隔符不是英文点(.),而是空格、逗号这类符号。你的4.6666M渲染到页面时被转成了4 6666,插入JS代码后会被识别为两个独立数字,自然输出空格分隔的结果。
  • 你写的代码本身也有语法问题:Razor只会解析带@前缀的服务端代码,你写的var jsItem = Model.AllTotalQuotes.SomeItem;没有加@,Model不会被服务端识别,jsItem实际是未赋值的JS变量,逻辑完全不符合你的预期。

你之前尝试的两种方案都是C#层面的类型转换,转换后还是decimal类型,渲染时仍然会走默认的区域格式化逻辑,所以解决不了问题。

解决方案

按需选择下面任意一种方案即可:

方案1:单场景强制固定格式

适合只有个别地方需要输出数值到JS的场景,显式指定用固定文化格式化:

  1. 先在视图顶部或者_ViewImports.cshtml引入命名空间:
@using System.Globalization
  1. 修改JS代码:
<script>
    var jsItem = @Model.AllTotalQuotes.SomeItem.ToString(CultureInfo.InvariantCulture);
    console.log(jsItem);
</script>

方案2:全局配置固定文化

如果项目没有多区域本地化需求,直接全局配置用固定文化,一劳永逸:
在Program.cs中添加配置:

// 服务注册阶段添加
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    options.DefaultRequestCulture = new RequestCulture(CultureInfo.InvariantCulture);
    options.SupportedCultures = new List<CultureInfo> { CultureInfo.InvariantCulture };
    options.SupportedUICultures = new List<CultureInfo> { CultureInfo.InvariantCulture };
});

// 中间件配置阶段,放在UseRouting之后、UseAuthorization之前添加
app.UseRequestLocalization();

配置完成后直接按原生写法输出即可:

<script>
    var jsItem = @Model.AllTotalQuotes.SomeItem;
    console.log(jsItem);
</script>

方案3:用JSON序列化自动处理格式

不想处理文化配置的话,直接用JSON序列化输出,数值格式永远符合JS语法要求:

<script>
    var jsItem = @Json.Serialize(Model.AllTotalQuotes.SomeItem);
    console.log(jsItem);
</script>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 12:03:01