簡體   English   中英

使用.NET格式化大數字

[英]Formatting Large Numbers with .NET

我要求將4,316,000這樣的大數字格式化為“4.3m”。

我怎么能在C#中做到這一點?

您可以使用Log10來確定正確的中斷。 像這樣的東西可以工作:

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

將數字除以1000000.0,然后加上“m”。

記得將數字四舍五入到小數點后1位。

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]}";
    }
}

這應輸出:

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
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);

如果您只在Windows上運行,則可以在C#或VB.NET中使用p-invoke聲明來調用Win32函數StrFormatByteSizeWStrFormatByteSize64 如果您的應用程序/站點保證至少在Vista SP1或Server 2008上運行,那么還有一些StrFormatByteSizeEx以及更多選項。

來自MSDN文檔的示例:

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

這些API還可以為非英語用戶正確處理本地化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM