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#?
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#?
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
Votado por verdad. –
¡Me encanta el enfoque Rachaor de Occam! – code4life
divida el número por 1000000.0, luego agregue una "m".
Recuerde redondear el número a 1 lugar decimal.
esto funciona si siempre está tratando de hacer millones, pero no si quiere miles, millones, miles de millones, etc. –
la pregunta acerca de números como 4,316,000 como "4,3m", otros formatos no estaban en los requisitos :) –
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);
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.
Esto no haría 4,316,000 como "4.3m", como la pregunta, sino "4.12MB" –
Vaya, lea la pregunta con respecto a los divisores binarios, en lugar de los divisores decimales. – devstuff
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
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. –
@Jim: C# está en las etiquetas de la pregunta. La pregunta podría ayudar al hacer eso un poco más obvio. –
¡Jim es un troll! –