Skip to content

Instantly share code, notes, and snippets.

@mr5z
Last active August 29, 2023 19:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mr5z/7ad4c409d1df664b9e0b60d025cd4fa8 to your computer and use it in GitHub Desktop.
Save mr5z/7ad4c409d1df664b9e0b60d025cd4fa8 to your computer and use it in GitHub Desktop.
Scalable solution for converting numbers to English words
using System.Numerics;
string ToWords(BigInteger number)
{
var ones = new string[] { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
var teens = new string[] { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
var xty = new string[] { "twenty", "thirty", "fourty", "fifty", "sixty", "seventy", "eighty", "ninety" };
var suffixes = new string[] {
"", "thousand", "million", "billion", "trillion",
"quadrillion", "quintillion", "sextillion", "septillion",
"octillion", "nonillion", "decillion", "undecillion",
"duodecillion", "tredecillion", "quattuordecillion",
"quindecillion", "sedecillion", "septemdecillion",
"octodecillion", "novemdecillion", "vigintillion",
"unvigintillion", "duovigintillion", "tresvigintillion",
"quattuorvigintillion", "quinvigintillion", "sesvigintillion",
"septemvigintillion", "octovigintillion", "novemvigintillion",
"trigintillion", "untrigintillion", "duotrigintillion",
"trestrigintillion", "quattuor­trigint­illion", "quintrigintillion",
"sestrigintillion", "septentrigintillion", "octotrigintillion",
"noventrigintillion", "quadragintillion"
};
if (number >= 1 && number <= 9)
{
return ones[(int)number - 1];
}
if (number >= 10 && number <= 19)
{
return teens[(int)number - 10];
}
if (number >= 20 && number <= 99)
{
var quotient = (int)Math.Floor((double)number / 10);
var remainder = (int)number % 10;
return $@"{xty[quotient - 2]} {(remainder > 0 ? ones[remainder - 1] : "")}";
}
if (number >= 100 && number <= 999)
{
var quotient = (int)number / 100;
var remainder = (int)number % 100;
return $@"{ones[quotient - 1]} hundred {(remainder > 0 ? ToWords(remainder) : "")}";
}
for(var i = suffixes.Length - 1;i >= 0; --i)
{
var magnitude = BigInteger.Pow(10, 3 * i);
if (number >= magnitude)
{
var quotient = number / magnitude;
var remainder = number % magnitude;
return $@"{ToWords(quotient)} {suffixes[i]} {(remainder > 0 ? ToWords(remainder) : "")}";
}
}
return "zero";
}
while (true)
{
Console.Write("< ");
var input = Console.ReadLine();
try
{
var sanitized = input.Replace("_", "");
var words = ToWords(BigInteger.Parse(sanitized));
var filtered = words.Split(' ', StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine("> " + string.Join(' ', filtered));
}
catch (Exception ex)
{
Console.WriteLine(ex);
break;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment