2009-10-12 20 views
8

Mam wymóg formatowania dużych liczb, takich jak 4 316 000, jako "4,3 miliona".Formatowanie dużych liczb za pomocą .NET

Jak mogę to zrobić w języku C#?

+1

Um, język programowania? Platforma? Pomóż nam tutaj. Krótka odpowiedź brzmi: napisz jakiś kod, aby sformatować różne zakresy wartości odpowiednio na podstawie wymagań. –

+1

@ Jim: C# znajduje się w tagach pytania. Pytanie może pomóc, czyniąc to trochę bardziej oczywistym. –

+0

Jim jest trollem! –

Odpowiedz

17

Możesz użyć Log10, aby ustalić prawidłowy podział. Coś takiego może działać:

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 
+1

Głosowało na prawda. –

+0

Uwielbiam podejście brzytwy Ockhama! – code4life

2

podziel liczbę przez 1000000,0, a następnie dodaj "m".

Pamiętaj o zaokrągleniu liczby do 1 miejsca po przecinku.

+0

to działa, jeśli zawsze próbuje zrobić miliony, ale nie, jeśli chce tysiące, miliony, miliardy, itp. –

+0

pytanie zadawane na temat liczby jak 4,316,000 jako "4,3 m", inne formaty nie były w wymaganiach :) –

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

Jeśli tylko w systemie Windows można użyć oświadczenie p-powołać się w C# lub VB.NET zadzwonić Win32 funkcjonuje StrFormatByteSizeW lub StrFormatByteSize64. Jeśli twoja aplikacja/witryna ma być uruchomiona na co najmniej Vista SP1 lub Server 2008, jest jeszcze StrFormatByteSizeEx z kilkoma dodatkowymi opcjami.

Próbka z docs MSDN:

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

Te API obsługuje również lokalizację poprawnie dla nieanglojęzycznych użytkowników.

+0

Nie byłoby to 4 316 000 jako "4,3 miliona", tak jak zadane pytanie, ale raczej "4.12MB" –

+0

Ups, przeczytaj pytanie dotyczące dzielników binarnych zamiast dziesiętnych. – devstuff

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

Powinno to wyjście:

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 
Powiązane problemy