C#中decimal使用"#.##"调用ToString时0值输出异常如何解决
问题原因
你遇到的空字符串是#占位符的特性导致的:#属于可选占位符,对应位置如果是前导/末尾无意义的0就会被省略,当数值为0时,整数部分的0也会被判定为无意义直接省略,最后就得到了空字符串。
更简洁的实现方案
根本不需要依赖三目运算符,.NET的数值格式化语法本身就支持你要的需求,分两种常用场景对应写法:
- 场景1:所有数值统一固定保留2位小数(不足补0,超过四舍五入)
直接用0.00格式符即可,0是强制占位符,对应位置没有值就会显示0,代码如下:decimal x = 0; var y = x.ToString("0.00"); // 输出 "0.00" // 其他数值测试:1 → "1.00",1.2 → "1.20",1.234 → "1.23" - 场景2:非0值最多保留2位小数、自动省略末尾无意义的0,0值单独显示为
0.00
可以用.NET内置的分段条件格式语法,格式串用分号分隔为「正数格式;负数格式;零值格式」三段,代码如下:decimal x = 0; var y = x.ToString("#.##;#.##;0.00"); // 输出 "0.00" // 其他数值测试:1 → "1",1.2 → "1.2",1.234 → "1.23",-1.2 → "-1.2"
方案对比
上述两种内置格式化写法的运行效率和你写三目运算符没有明显差异,代码更简洁,可读性也更高,比自定义三目判断的方案更优。
内容的提问来源于stack exchange,提问作者user17176542
相关产品推荐
相关产品推荐

