2009-10-12 22 views
8

Tengo un requisito para formatear números grandes como 4,316,000 como "4,3 m".Formateo de números grandes con .NET

¿Cómo puedo hacer esto en C#?

+1

Um, lenguaje de programación? ¿Plataforma? Ayúdanos aquí. La respuesta breve es: escriba un código para formatear varios rangos de valores según los requisitos. –

+1

@Jim: C# está en las etiquetas de la pregunta. La pregunta podría ayudar al hacer eso un poco más obvio. –

+0

¡Jim es un troll! –

Respuesta

17

Puede usar Log10 para determinar la ruptura correcta. Algo como esto podría funcionar:

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

Votado por verdad. –

+0

¡Me encanta el enfoque Rachaor de Occam! – code4life

2

divida el número por 1000000.0, luego agregue una "m".

Recuerde redondear el número a 1 lugar decimal.

+0

esto funciona si siempre está tratando de hacer millones, pero no si quiere miles, millones, miles de millones, etc. –

+0

la pregunta acerca de números como 4,316,000 como "4,3m", otros formatos no estaban en los requisitos :) –

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

Si sólo se ejecuta en Windows se puede utilizar un p-invocar declaración en C# o VB.NET para llamar al Win32 funciona StrFormatByteSizeW o StrFormatByteSize64. Si su aplicación/sitio está garantizado para ejecutarse al menos Vista SP1 o Server 2008 también hay StrFormatByteSizeEx con algunas opciones más.

muestra de la documentación de MSDN:

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

Estas API también se encargan de la localización correcta para que los usuarios no están en inglés.

+0

Esto no haría 4,316,000 como "4.3m", como la pregunta, sino "4.12MB" –

+0

Vaya, lea la pregunta con respecto a los divisores binarios, en lugar de los divisores decimales. – 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]}"; 
    } 
} 

Esta es la Salida:

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 
Cuestiones relacionadas