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>
更合理的实现方式
视图层只应该负责渲染数据,不应该承载计算逻辑,最佳实践是把求和计算移到控制器/服务层完成:
- 后端处理逻辑(控制器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);
- 视图层直接渲染结果,不需要任何循环计算:
<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
相关产品推荐
相关产品推荐

