如何格式化数字以具有相同的位数?
Posted
技术标签:
【中文标题】如何格式化数字以具有相同的位数?【英文标题】:How can I format numbers to have the same number of digits? 【发布时间】:2012-08-15 14:24:30 【问题描述】:我有一个标签来显示一个无符号整数,它有一个最大长度。我想格式化数字以显示如下:
1 = "1"
1000 = "1,000"
12400 = "12.4k"
101,800,000 = "102M" // !!!
1,849,000 = "1.85M"
所以,我最终得到了一个最大长度为 5 的字符串。
我的范围是从 0 到 199,999,999。
有没有办法在不处理很多情况(即很多间隔)的情况下做到这一点?
【问题讨论】:
您的问题的要求似乎过于具体,以至于无法让现有的解决方案完全按照您的意愿行事。您可能必须编写自己的函数。另外,1.800.000 = "1,85M" 怎么算?如果你的范围达到最大值 1,999,999,你怎么能得到 101.800.000 = "102M" ? 是 101.800.000 一个有效的情况,考虑到“范围是从 0 到 1,999,999”。 ? 抱歉,我弄乱了范围、1.85M 和分隔符(在我的语言中,“.”是“,”,而“,”是“.”)... 我个人会为无符号整数类编写一个扩展方法,它会内置逻辑。我有类似的日期,即“1天前”、“14天前”、“ 3 个月前”等用于在 DateTime 上编写友好格式。 您只需要与您计划实施的偏差一样多的案例。所以在您的案例中,您只需要。 1024 -> 1,024, 12345 -> 12.4k, 123456 -> 123k, 1234567 -> 1.2m, 12345678 -> 12m。 5个案例让你承保高达10亿。 【参考方案1】:我可能来不及了,但这里有一个扩展方法,它返回你想要格式化的数字:
public static string ToShortString(this int n)
if (n >= 1e8)
return (Math.Round((double)n / 1e6, 0)).ToString() + "M";
else if (n >= 1e7)
return (Math.Round((double)n / 1e6, 1)).ToString() + "M";
else if (n >= 1e6)
return (Math.Round((double)n / 1e6, 2)).ToString() + "M";
else if (n >= 1e5)
return (Math.Round((double)n / 1e3, 0)).ToString() + "K";
else if (n >= 1e4)
return (Math.Round((double)n / 1e3, 1)).ToString() + "K";
else if (n >= 1e3)
return n.ToString("##,#");
else
return n.ToString();
测试:
Console.WriteLine((5).ToShortString()); // displays 5
Console.WriteLine((55).ToShortString()); // displays 55
Console.WriteLine((555).ToShortString()); // displays 555
Console.WriteLine((5555).ToShortString()); // displays 5,555
Console.WriteLine((55555).ToShortString()); // displays 55.6K
Console.WriteLine((555555).ToShortString()); // displays 556K
Console.WriteLine((5555555).ToShortString()); // displays 5.56M
Console.WriteLine((55555555).ToShortString()); // displays 55.6M
Console.WriteLine((555555555).ToShortString()); // displays 556M
【讨论】:
【参考方案2】:这里的答案显示了如何以多种方式做到这一点:Round numbers with K suffix
不幸的是,如果没有至少相当数量的案例,我不知道有什么方法可以做到这一点。但是上面问题中的一些答案做得相当优雅,而且代码量最少。
【讨论】:
以上是关于如何格式化数字以具有相同的位数?的主要内容,如果未能解决你的问题,请参考以下文章