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

cshtml中Convert.ToInt32转字符串求和报FormatException问题咨询

问题根因

你遇到的System.FormatException和代码逻辑错误来自三个核心问题:

  • 类型转换逻辑错误:三个字段是字符串类型的金额/税率值,大概率包含小数、货币符号、千分位分隔符、空值等非整数字符,直接用Convert.ToInt32()尝试转成整数必然触发格式异常;且金额属于高精度数值,本身就不应该用int类型存储。
  • 循环逻辑错误:for循环已经定义了i++自增规则,你在循环内部额外写了i = i + 1,会导致每次循环索引跳2位,一半的列表元素会被跳过,极端情况还会触发索引越界异常。
  • Razor语法错误:在@{}C#代码块内部多余使用@前缀(@for、@position的写法都是错的),会引发视图引擎解析混乱。
即时修复方案

如果暂时要在视图内完成计算,可按如下方式修正代码:

<table class="table">
  <thead>
    <tr>
      <th scope="col">Suma netto</th>
      <th scope="col">Suma VAT</th>
      <th scope="col">Suma brutto</th> 
    </tr>
  </thead>
  <tbody>
    @{
        // 金额用decimal类型,不要用int
        decimal totalNetto = 0;
        decimal totalVat = 0;
        decimal totalBrutto = 0;
        // 去掉代码块内多余的@,去掉循环内额外的i自增
        for(int i = 0; i < Model.Data.Count; i++){
          var position = Model.Data[i];
          // 转换时指定波兰区域格式,兼容货币符号、小数分隔符,加容错避免抛错
          if(decimal.TryParse(position.NetPrice, NumberStyles.Currency, new CultureInfo("pl-PL"), out var netVal))
            totalNetto += netVal;
          if(decimal.TryParse(position.TaxRate, NumberStyles.Any, CultureInfo.InvariantCulture, out var vatVal))
            totalVat += vatVal;
          if(decimal.TryParse(position.BruttoPrice, NumberStyles.Currency, new CultureInfo("pl-PL"), out var bruttoVal))
            totalBrutto += bruttoVal;
        }
    }
    <tr>
      <td>@totalNetto.ToString("N2")</td>
      <td>@totalVat.ToString("N2")</td>
      <td>@totalBrutto.ToString("N2")</td>   
    </tr>
  </tbody>
</table>
更合理的实现方式

视图层只应该负责渲染数据,不应该承载计算逻辑,最佳实践是把求和计算移到控制器/服务层完成:

  1. 后端处理逻辑(控制器Action中,需提前引入System.Globalization命名空间):
decimal totalNetto = 0, totalVat = 0, totalBrutto = 0;
var plCulture = new CultureInfo("pl-PL");
foreach(var item in model.Data)
{
    if(decimal.TryParse(item.NetPrice, NumberStyles.Currency, plCulture, out var net)) 
        totalNetto += net;
    if(decimal.TryParse(item.TaxRate, NumberStyles.Any, CultureInfo.InvariantCulture, out var vat)) 
        totalVat += vat;
    if(decimal.TryParse(item.BruttoPrice, NumberStyles.Currency, plCulture, out var brutto)) 
        totalBrutto += brutto;
}
// 把计算结果传给视图
ViewBag.TotalNetto = totalNetto;
ViewBag.TotalVat = totalVat;
ViewBag.TotalBrutto = totalBrutto;
return View(model);
  1. 视图层直接渲染结果,不需要任何循环计算:
<tbody>
  <tr>
    <td>@ViewBag.TotalNetto.ToString("C", new CultureInfo("pl-PL"))</td>
    <td>@ViewBag.TotalVat</td>
    <td>@ViewBag.TotalBrutto.ToString("C", new CultureInfo("pl-PL"))</td>
  </tr>
</tbody>

这种实现方式逻辑分层清晰,排错简单,也不会出现视图层的语法解析问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:39:23