如何格式化数字以具有相同的位数?

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

不幸的是,如果没有至少相当数量的案例,我不知道有什么方法可以做到这一点。但是上面问题中的一些答案做得相当优雅,而且代码量最少。

【讨论】:

以上是关于如何格式化数字以具有相同的位数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在角图中以不同方式格式化中位数和误差?

如何格式化数字 0..9 以显示 2 位数字(它不是日期)

如何在 MS Access 中设置相同的显示格式

如何格式化数字以获得最小的字符串长度

如何在 Delphi 中将浮点数转换为字符串,指定有效数字,而不是十进制数字(而不是 G 格式)

如何格式化具有最大小数位数且没有额外零填充的浮点数?