C#中Decimal类型ToString时如何在任意文化下去除小数点、逗号及小数部分?
嘿,我来帮你搞定这个问题!你想要的是把decimal转成完全没有小数点、千分符,也不带小数部分的字符串,而且不管系统是什么文化区域都能生效对吧?
首先说你之前用InvariantCulture配合"N0"的问题:"N0"是数字格式,它的作用是保留0位小数,但会自动添加千分分隔符(InvariantCulture里是逗号,而有些欧洲文化里会用小数点当千分符,这就是你看到小数点的原因),所以这个格式不符合你的需求。
下面给你几个靠谱的实现方式,按推荐程度排序:
1. 最优方案:自定义格式字符串 + 截断(可选)
如果需要截断小数部分(不四舍五入),先通过Math.Truncate去掉小数位,再用"0"格式配合InvariantCulture:
decimal myDecimal = 1234.99m; // 截断小数部分,得到纯整数的decimal decimal truncated = Math.Truncate(myDecimal); // 转成无任何分隔符的字符串 string result = truncated.ToString("0", CultureInfo.InvariantCulture); // 输出:"1234"
如果可以接受四舍五入到整数,直接用"0"格式就行:
decimal myDecimal = 1234.99m; string result = myDecimal.ToString("0", CultureInfo.InvariantCulture); // 输出:"1235"
这里用"0"而不是"#"的原因是:如果decimal的值是0m,"#"会输出空字符串,而"0"会正常输出"0",更符合大多数场景的需求。
2. 整数转换法(仅限decimal值在整数类型范围内)
如果你的decimal值肯定不会超过long的范围(也就是-9223372036854775808到9223372036854775807之间),可以直接转成整数类型再ToString:
decimal myDecimal = 1234.56m; string result = ((long)myDecimal).ToString(); // 输出:"1234"
这个方法简单,但要注意:如果decimal值超出整数范围,会抛出OverflowException,所以只适合确定值不会溢出的场景。
3. 自定义NumberFormatInfo(略繁琐)
你也可以手动创建一个NumberFormatInfo,把所有分隔符都设为空,再用数字格式:
var customFormat = new NumberFormatInfo { NumberDecimalSeparator = "", NumberGroupSeparator = "", NumberDecimalDigits = 0 }; decimal myDecimal = 1234.56m; string result = myDecimal.ToString("N", customFormat); // 输出:"1234"
这个方法也能生效,但比第一种方案麻烦,一般不推荐。
最后再强调下:不管用哪种方法,一定要指定InvariantCulture(或者自定义的NumberFormatInfo),不然系统会用当前线程的文化设置,可能出现你不想要的分隔符。
内容的提问来源于stack exchange,提问作者Lars Holdgaard

