defmodule NumToWordsList do def say(0), do: "zero" def say(number) when is_integer(number), do: [to_word(number)] |> List.flatten |> Enum.reject(&Kernel.is_nil/1) |> Enum.join(" ") def say(_), do: IO.puts "That's not a number" defp to_word(n) when n < 0, do: ["negative", to_word(-n)] defp to_word(0), do: nil defp to_word(1), do: "one" defp to_word(2), do: "two" defp to_word(3), do: "three" defp to_word(4), do: "four" defp to_word(5), do: "five" defp to_word(6), do: "six" defp to_word(7), do: "seven" defp to_word(8), do: "eight" defp to_word(9), do: "nine" defp to_word(10), do: "ten" defp to_word(11), do: "eleven" defp to_word(12), do: "twelve" defp to_word(13), do: "thirteen" defp to_word(14), do: "fourteen" defp to_word(15), do: "fifteen" defp to_word(16), do: "sixteen" defp to_word(17), do: "seventeen" defp to_word(18), do: "eighteen" defp to_word(19), do: "nineteen" defp to_word(20), do: "twenty" defp to_word(30), do: "thirty" defp to_word(40), do: "forty" defp to_word(50), do: "fifty" defp to_word(60), do: "sixty" defp to_word(70), do: "seventy" defp to_word(80), do: "eighty" defp to_word(90), do: "ninety" defp to_word(n) when n < 100, do: [to_word(div(n,10)*10), to_word(rem(n, 10))] defp to_word(n) when n < 1_000, do: [to_word(div(n,100)), "hundred", to_word(rem(n, 100))] defp to_word(n) when n < 1_000_000, do: [to_word(div(n,1_000)), "thousand", to_word(rem(n, 1_000))] defp to_word(n) when n < 1_000_000_000, do: [to_word(div(n,1_000_000)), "million", to_word(rem(n, 1_000_000))] defp to_word(n) when n < 1_000_000_000_000, do: [to_word(div(n,1_000_000_000)), "billion", to_word(rem(n, 1_000_000_000))] defp to_word(_), do: "I'm sorry, I can't count that high." end