thousands number net examples ejemplo c# .net formatting numbers humanize

c# - number - Formateo de números grandes con.NET



string.format c# number (5)

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

Tengo un requisito para formatear números grandes como 4,316,000 como "4.3m".

¿Cómo puedo hacer esto en C #?


Si solo está ejecutando en Windows podría usar una declaración p-invoke en C # o VB.NET para llamar a las funciones de Win32 StrFormatByteSizeW o StrFormatByteSize64 . Si se garantiza que su aplicación / sitio se ejecutará al menos Vista SP1 o Server 2008, también hay StrFormatByteSizeEx con algunas opciones más.

Muestra de los documentos 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 manejan la localización correctamente para usuarios que no son ingleses.


divide el número por 1000000.0, luego agrega una "m".

recuerde redondear el número a 1 lugar decimal.


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


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

Esto debería dar como resultado:

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