Sometimes you will have to play with numbers, BIG numbers… Or teeny-tiny ones! To avoid having too many zeros you can use the SI prefixes (like metric units: mm, cm, m, km, …).
Here are the results of our code:
123,460000 -> 123,460 w (1000)
123,460000 -> 123,460 w (1024)
1.234,560000 -> 1,235 kw (1000)
1.234,560000 -> 1,206 kw (1024)
123.456,000000 -> 123,456 kw (1000)
123.456,000000 -> 120,563 kw (1024)
1.234.567,000000 -> 1,235 Mw (1000)
1.234.567,000000 -> 1,177 Mw (1024)
12.345.678,000000 -> 12,346 Mw (1000)
12.345.678,000000 -> 11,774 Mw (1024)
0,012300 -> 12,300 mw (1000)
0,012300 -> 12,595 mw (1024)
0,000012 -> 12,300 µw (1000)
0,000012 -> 12,897 µw (1024)
And here is the helper:
static void Main(string[] args)
{
var unit = "w"; // To denote we are measuring "wathever"
foreach (var example in new[] { 123.46, 1234.56, 123456, 1234567, 12345678, 0.0123, 0.0000123 })
{
foreach (var groupWeight in new[] { 1000 /* Decimal*/, 1024 /* Binary */ })
{
Console.WriteLine("{0,22:#,##0.000000} -> {1,16} ({2,4})",
example, Format(example, unit, groupWeight), groupWeight);
}
}
Console.ReadLine();
}
static string Format(
double number,
string unitSymbol,
int groupWeight = 1000,
string unitMultipliers = " kMGT",
string unitDivider = " mµnp")
{
string formatted = null;
var numberWeigth = (int)Math.Floor(Math.Log(number) / Math.Log(groupWeight));
Nullable<char> unitWeigthSymbol = null;
if (numberWeigth > 0)
{
numberWeigth = Math.Min(numberWeigth, unitMultipliers.Length - 1);
unitWeigthSymbol = unitMultipliers[numberWeigth];
}
else
{
numberWeigth = -Math.Min(Math.Abs(numberWeigth), unitDivider.Length - 1);
unitWeigthSymbol = unitDivider[-numberWeigth];
}
number = number / Math.Pow(groupWeight, numberWeigth);
formatted = string.Format("{0:0.000} {1}{2}", number, unitWeigthSymbol, unitSymbol);
return (formatted);
}
}Now if you need to specify the decimal separator as a dot or as a coma, please have a look at this article.
Happy coding^9 ! 😉





