using System.Globalization;
public static void Main()
var d0 = HumanizeBigNumber(1234567890);
Console.WriteLine(d0.PadRight(10) + DehumanizeBigNumber(d0));
for (int i = 0; i < 27; i++)
var d = HumanizeBigNumber(Math.Pow(10, i));
Console.WriteLine(d.PadRight(10) + DehumanizeBigNumber(d));
Console.WriteLine(ex.Message);
private static string HumanizeBigNumber(double bigNumber)
const string symbols = "kMGTPEZY";
if (bigNumber > Math.Pow(10, 26))
throw new ArgumentOutOfRangeException("bigNumber");
.ToString("0.###E+0", CultureInfo.InvariantCulture)
.Split(new[] { 'E', '+' }, StringSplitOptions.RemoveEmptyEntries)
.Select(Double.Parse).ToArray();
var number = numbers[0] * Math.Pow(10, numbers[1] % 3);
var i = (numbers[1] / 3) - 1;
var letter = i >= 0 ? symbols[(int)i].ToString() : String.Empty;
private static double DehumanizeBigNumber(string humanizeBigNumber)
const string symbols = "kMGTPEZY";
var letter = Char.IsLetter(humanizeBigNumber.Last()) ? humanizeBigNumber.Last().ToString() : String.Empty;
return String.IsNullOrEmpty(letter)
? Double.Parse(humanizeBigNumber)
: (Double.Parse(humanizeBigNumber.Remove(humanizeBigNumber.Length - 1))
* Math.Pow(10, 3 + symbols.IndexOf(letter, StringComparison.Ordinal) * 3));