Skip to content

Instantly share code, notes, and snippets.

@shkschneider
Created May 9, 2019 14:21
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 shkschneider/ac6221fe962cdc30123a5dd0c90a6bfc to your computer and use it in GitHub Desktop.
Save shkschneider/ac6221fe962cdc30123a5dd0c90a6bfc to your computer and use it in GitHub Desktop.
Number.toEnglish()
// toEnglish
// <https://stackoverflow.com/a/47376072/603270>
private val zero = "zero"
private val oneToNine = listOf("one", "two", "three", "four", "five", "six", "seven", "height", "nine")
private val tenToNinteen = listOf("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")
private val dozens = listOf("ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety")
private fun fromOneToAHundred(number: Short): String = if (number == 0.toShort()) "" else
when {
number <= 9 -> oneToNine[number - 1]
number <= 19 -> tenToNinteen[number % 10]
else -> "${dozens[number / 10 - 1]} ${fromOneToMany(number % 10)}"
}
private fun fromOneToMany(number: Int): String = when {
number >= 1_000_000_000 -> fromOneToMany(number / 1_000_000_000) + " billion " + fromOneToMany(number % 1_000_000_000)
number >= 1_000_000 -> fromOneToMany(number / 1_000_000) + " million " + fromOneToMany(number % 1_000_000)
number >= 1_000 -> fromOneToMany(number / 1_000) + " thousand " + fromOneToMany(number % 1_000)
number >= 100 -> fromOneToMany(number / 100) + " hundred " + fromOneToMany(number % 100)
else -> fromOneToAHundred(number.toShort())
}
private fun toEnglish(number: Int): String = when {
number < 0 -> "minus ${toEnglish(-number)}"
number > 0 -> fromOneToMany(number).trim { it <= ' ' }
else -> zero
}
fun Number.toEnglish(): String = toEnglish(this.toInt())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment