字符串转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
相关产品推荐
相关产品推荐

