Formatting Large Numbers with .NET

前端 未结 5 1800
梦如初夏
梦如初夏 2020-12-16 03:45

I have a requirement to format large numbers like 4,316,000 as \"4.3m\".

How can I do this in C#?

相关标签:
5条回答
  • 2020-12-16 04:15

    You can use Log10 to determine the correct break. Something like this could work:

    double number = 4316000;
    
    int mag = (int)(Math.Floor(Math.Log10(number))/3); // Truncates to 6, divides to 2
    double divisor = Math.Pow(10, mag*3);
    
    double shortNumber = number / divisor;
    
    string suffix;
    switch(mag)
    {
        case 0:
            suffix = string.Empty;
            break;
        case 1:
            suffix = "k";
            break;
        case 2:
            suffix = "m";
            break;
        case 3:
            suffix = "b";
            break;
    }
    string result = shortNumber.ToString("N1") + suffix; // 4.3m
    
    0 讨论(0)
  • 2020-12-16 04:15

    divide the number by 1000000.0, then append an "m".

    remember to round the number to 1 decimal place.

    0 讨论(0)
  • 2020-12-16 04:26
    long valueToFormat = 4316000;
    var dict = new Dictionary<long, string>() {
        {1000000000, "b"},
        {1000000, "m"},
        {1000, "k"}
     };
    
     string formattedValue = valueToFormat.ToString();
     foreach (long n in dict.Keys.OrderBy(k => k)) {
         if (valueToFormat < n) {
             continue;
         }
         double value = Math.Round(valueToFormat / (double)n, 1);
         formattedValue = String.Format("{0}{1}", value, dict[n]);
     }
     Console.WriteLine(formattedValue);
    
    0 讨论(0)
  • 2020-12-16 04:31
    public static class Program
    {
        private static void Main(string[] args)
        {
            double[] numbers =
            {
                3000, 3300, 3333, 30000, 300000, 3000000, 3000003, 0.253, 0.0253, 0.00253, -0.253003
            };
    
            foreach (var num in numbers)
            {
                Console.WriteLine($"{num} ==> {num.Humanize()}");
            }
    
            Console.ReadKey();
        }
    
        public static string Humanize(this double number)
        {
            string[] suffix = {"f", "a", "p", "n", "μ", "m", string.Empty, "k", "M", "G", "T", "P", "E"};
    
            var absnum = Math.Abs(number);
    
            int mag;
            if (absnum < 1)
            {
                mag = (int) Math.Floor(Math.Floor(Math.Log10(absnum))/3);
            }
            else
            {
                mag = (int) (Math.Floor(Math.Log10(absnum))/3);
            }
    
            var shortNumber = number/Math.Pow(10, mag*3);
    
            return $"{shortNumber:0.###}{suffix[mag + 6]}";
        }
    }
    

    This should output:

    3000 ==> 3k
    3300 ==> 3,3k
    3333 ==> 3,333k
    30000 ==> 30k
    300000 ==> 300k
    3000000 ==> 3M
    3000003 ==> 3M
    0,253 ==> 253m
    0,0253 ==> 25,3m
    0,00253 ==> 2,53m
    -0,253003 ==> -253,003m
    
    0 讨论(0)
  • 2020-12-16 04:32

    If you're only running on Windows you could use a p-invoke declaration in C# or VB.NET to call the Win32 functions StrFormatByteSizeW or StrFormatByteSize64. If your application/site is guaranteed to be running on at least Vista SP1 or Server 2008 there's also StrFormatByteSizeEx with a few more options.

    Sample from the MSDN docs:

    Numeric value   Text string 
    532             532 bytes 
    1340            1.30KB 
    23506           22.9KB 
    2400016         2.29MB 
    2400000000      2.23GB 
    

    These APIs also handle localization correctly for non-English users.

    0 讨论(0)
提交回复
热议问题