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

字符串转Decimal并保留两位小数:代码优化及格式符疑问

嘿,我来帮你梳理下这个问题~

代码优化方案

你现在的代码其实绕了个没必要的弯——先把decimal转成字符串再转回decimal,完全可以直接用decimal.Round方法一步到位,既简洁又减少了不必要的字符串转换开销:

decimal newDecimal;
if (decimal.TryParse(InvoiceDialog.InvoiceAmount, out newDecimal))
{
    // 保留两位小数,第二个参数是小数位数,第三个可选参数是舍入规则
    invoice.Amount = decimal.Round(newDecimal, 2, MidpointRounding.AwayFromZero);
}

如果你的项目用的是C# 7.0及以上版本,还可以用更简洁的语法:

if (decimal.TryParse(InvoiceDialog.InvoiceAmount, out var newDecimal))
{
    invoice.Amount = decimal.Round(newDecimal, 2, MidpointRounding.AwayFromZero);
}

这里补充下:MidpointRounding.AwayFromZero是可选的,它决定了当小数点后第三位是5时的舍入逻辑(比如123.345会变成123.35),如果不加的话会默认使用银行家舍入法(可能会得到123.34),你可以根据自己的业务需求选择是否添加。

另外要注意:如果你的核心需求只是让invoice.Amount显示时是两位小数,其实decimal本身只要精度足够,直接赋值也没问题,但用decimal.Round能从数值层面保证它就是两位小数的decimal值,更稳妥。

字符串格式符########.00与########.##的区别

先给你拆解下格式符里#和0的具体作用:

  • 0:强制占位符
    不管对应位置有没有有效数字,都会用0填充。举几个例子:
    • 数字123用########.00格式化 → 123.00
    • 数字123.3用########.00格式化 → 123.30
      它的核心是强制保留指定的小数位数,不足补0。
  • #:可选占位符
    只显示有意义的数字,对应位置如果是前导零、末尾零或者没有数字,就会省略。例子:
    • 数字123用########.##格式化 → 123
    • 数字123.3用########.##格式化 → 123.3
    • 数字123.45用########.##格式化 → 123.45
      它的核心是最多保留两位小数,末尾的零会被自动省略。

简单说,########.00是“必须两位小数”,########.##是“最多两位小数”,这就是两者最本质的区别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:45:42