lib/integer_to_english.ex

defmodule IntegerToEnglish do
  @moduledoc "Convert an integer into english words."

  use IntegerToEnglish.Macros

  @doc """
  Convert an integer into english words.

  ## Examples

      iex> IntegerToEnglish.integer_to_english(12)
      "twelve"
      iex> IntegerToEnglish.integer_to_english(-3034)
      "negative three thousand and thirty four"
      iex> IntegerToEnglish.integer_to_english(3823404)
      "three million, eight hundred twenty three thousand, four hundred four"

  """
  def integer_to_english(i) when i < 0, do: "negative " <> integer_to_english(i * -1)
  def integer_to_english(0), do: "zero"
  def integer_to_english(1), do: "one"
  def integer_to_english(2), do: "two"
  def integer_to_english(3), do: "three"
  def integer_to_english(4), do: "four"
  def integer_to_english(5), do: "five"
  def integer_to_english(6), do: "six"
  def integer_to_english(7), do: "seven"
  def integer_to_english(8), do: "eight"
  def integer_to_english(9), do: "nine"
  def integer_to_english(10), do: "ten"
  def integer_to_english(11), do: "eleven"
  def integer_to_english(12), do: "twelve"
  def integer_to_english(13), do: "thirteen"
  def integer_to_english(14), do: "fourteen"
  def integer_to_english(15), do: "fifteen"
  def integer_to_english(16), do: "sixteen"
  def integer_to_english(17), do: "seventeen"
  def integer_to_english(18), do: "eighteen"
  def integer_to_english(19), do: "nineteen"

  generate_clause("twenty", 20, 30)
  generate_clause("thirty", 30, 40)
  generate_clause("fourty", 40, 50)
  generate_clause("fifty", 50, 60)
  generate_clause("sixty", 60, 70)
  generate_clause("seventy", 70, 80)
  generate_clause("eighty", 80, 90)
  generate_clause("ninety", 90, 100)
  generate_clause("hundred", 100, 1000)
  generate_clause("thousand", 1000, 1_000_000)
  generate_clause("million", 1_000_000, 1_000_000_000)
  generate_clause("billion", 1_000_000_000, 1_000_000_000_000)
end