如何将整数格式化为1、1K、51M这类简化字符串?
整数简化格式化实现与C#格式符详解
先修正你现有代码的bug
你现在这段代码有个坑:num / 1_000是整数除法,比如1100除以1000会直接截断成1,输出就变成"1K",根本出不来你要的"1,1K"。得改成浮点数除法:num / 1000.0,这样才能得到带小数的结果。
核心:把那些格式符说透
你提到的0.#、#,0K都是C#的自定义数字格式字符串,逐个拆解明白:
1. 基础占位符:0 和
0:强制占位符,不管有没有意义,对应位置必须显示数字,缺的补0。比如:- 1.0.ToString("0.0") → 输出"1.0"
- 1.ToString("000") → 输出"001"
#:可选占位符,只显示有意义的数字,末尾的0直接省略。比如:- 1.0.ToString("0.#") → 输出"1"
- 1.1.ToString("0.#") → 输出"1.1"
- 1.05.ToString("0.#") → 输出"1.1"(自动四舍五入)
2. 缩放符:逗号","
这个是你可能没搞懂的点——格式里的逗号不是千位分隔符,是缩放说明符,每加一个逗号,就把原数字除以1000。比如:
- 1000.ToString("0,") → 1000/1000=1 → 输出"1"
- 1100.ToString("0.0,") → 1100/1000=1.1 → 输出"1.1"
- 1000000.ToString("0,,") → 1000000/1000/1000=1 → 输出"1"
3. 常见组合格式对比
0.#:你代码里用的,把除以1000后的数,保留整数位+最多一位小数(末尾0自动丢)。测试下:- 1000/1000.0=1 → 输出"1"
- 1100/1000.0=1.1 → 输出"1.1"
- 1050/1000.0=1.05 → 输出"1.1"(四舍五入)
#,0K:这里的逗号是缩放符,相当于先把数字除以1000,再用0格式取整,最后加K。比如:- 1000.ToString("#,0K") → "1K"
- 1100.ToString("#,0K") → "1K"(1.1取整成1)
- 10000.ToString("#,0K") → "10K"
满足你所有示例的完整代码
要覆盖你给的所有情况(1→1,1000→1K,1100→1,1K,11000→10K,1000000→1M),得分区间处理,还得对应调整格式:
public class NumberFormatter { public string FormatNumber(int num) { // 小于1000,直接输出原数 if (num < 1000) { return num.ToString(); } // 1000到999999,用K做单位 else if (num < 1_000_000) { // 如果你要11000→10K这种取整到10倍的效果,就用这段 var kValue = Math.Floor((num / 1000.0) / 10) * 10; return kValue.ToString("0") + "K"; // 要是想11000→11K,就换成这个: // return (num / 1000.0).ToString("0.#") + "K"; } // 100万及以上,用M做单位 else { return (num / 1_000_000.0).ToString("0.#") + "M"; } } }
测试效果完全匹配你的示例:
- 1 → "1"
- 100 → "100"
- 1000 → "1K"
- 1100 → "1.1K"
- 11000 → "10K"
- 100000 → "100K"
- 1000000 → "1M"
按需自定义的小技巧
根据你的需求改格式符就行:
- 强制保留一位小数:用
0.0,比如1000→"1.0K" - 只保留整数位:用
0,比如1100→"1K" - 保留两位小数:用
0.##,比如1150→"1.15K" - 要更大的单位(比如G),再加个else if区间,除以10亿即可。
内容的提问来源于stack exchange,提问作者Tyler Jay
相关产品推荐
相关产品推荐

