【问题标题】:String Format Numbers Thousands 123K, Millions 123M, Billions 123B字符串格式数字千位123K、百万位123M、十亿位123B
【发布时间】:2012-07-31 01:39:28
【问题描述】:

有没有一种方法可以使用字符串格式化程序将 Thousands、Millions、Billions 格式化为 123K、123M、123B,而无需更改代码以将值除以 Thousand、Million 或 Billion?

String.Format("{0:????}", LargeNumber)

【问题讨论】:

    标签: c# string-formatting


    【解决方案1】:

    有不同的方法可以实现这一点,但对我来说最简单快捷的是使用the "," custom specifier

    double value = 1234567890;
    
    // Displays 1,234,567,890   
    Console.WriteLine(value.ToString("#,#", CultureInfo.InvariantCulture));
    
    // Displays 1,234,568K
    Console.WriteLine(value.ToString("#,##0,K", CultureInfo.InvariantCulture));
    
    // Displays 1,235M
    Console.WriteLine(value.ToString("#,##0,,M", CultureInfo.InvariantCulture));
    
    // Displays 1B
    Console.WriteLine(value.ToString("#,##0,,,B", CultureInfo.InvariantCulture));
    

    【讨论】:

    • 如果我使用它作为“#,##0,,,.00B”它会四舍五入最后一位小数,但我不想要它。
    • value.ToString("0,,,.#B", CultureInfo.InvariantCulture) => 1.2B
    • 有什么方法可以将它与货币一起使用?
    • 十万户呢?我怎样才能得到它?
    【解决方案2】:

    我在扩展方法中使用了这种混合格式(只需将其添加到您的项目中即可享受)?

    public static string ToKMB(this decimal num)
    {
        if (num > 999999999 || num < -999999999 )
        {
            return num.ToString("0,,,.###B", CultureInfo.InvariantCulture);
        }
        else
        if (num > 999999 || num < -999999 )
        {
            return num.ToString("0,,.##M", CultureInfo.InvariantCulture);
        }
        else
        if (num > 999 || num < -999)
        {
            return num.ToString("0,.#K", CultureInfo.InvariantCulture);
        }
        else
        {
            return num.ToString(CultureInfo.InvariantCulture);
        }
    }
    

    用途:

    ((decimal)235).ToKMB();
    // 235
    
    ((decimal)1235).ToKMB();
    // 1.2K
    
    ((decimal)6271235).ToKMB();
    // 6.27M
    
    ((decimal)93246571235).ToKMB();
    // 93.247B
    

    注意事项:

    • 它会为更大的数字返回更多细节,我喜欢它。

    • 它也支持负数。 (感谢@Dusty 在 cmets 中的注释。

    • 我在这个例子中为decimal数字写了一个方法,你可以为它写一些覆盖方法来支持int、long和double在没有任何转换的情况下使用它,例如:

      myIntNumber.ToKMB();

      myLongNumber.ToKMB();

      myDoubleNumber.ToKMB();

      myDecimalNumber.ToKMB();

    【讨论】:

    • 十万户呢?我怎样才能得到它?
    • @ChandanKumar,你的意思是像 100,000 这样的数字吗?我的扩展方法 (((decimal)100000).ToKMB()) 为其返回此结果:100k
    • 值得注意的是,如果所有 if 条件也涵盖否定条件,则这涵盖了更完整的用例……例如,if(num &gt; 999 || num &lt; -999)。
    【解决方案3】:

    您可以实现一个ICustomFormatter,将值除以千、百万或十亿,并像这样使用它:

    var result = string.Format(new MyCustomFormatter(), "{0:MyFormat}", number);
    

    【讨论】:

    • 实现应该是ICustomFormatter和IFormatProvider接口
    猜你喜欢
    • 2021-12-14
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    相关资源
    最近更新 更多