open System
module Speller =
let getDigits number =
match number with
| 0 -> ""
| 1 -> "one"
| 2 -> "two"
| 3 -> "three"
| 4 -> "four"
| 5 -> "five"
| 6 -> "six"
| 7 -> "seven"
| 8 -> "eight"
| 9 -> "nine"
| _ -> failwith("Incorrect format: " + number.ToString())
let getTens number =
match number with
| 0 -> String.Empty
| _ when number < 10 -> getDigits number
| _ when number < 20 ->
match number with
| 10 -> "ten"
| 11 -> "eleven"
| 12 -> "twelve"
| 13 -> "thirteen"
| 15 -> "fifteen"
| _ -> getDigits(number - 10) + "teen"
| _ ->
let tens = number / 10
let digits = number % 10
match tens with
| 2 -> "twenty " + getDigits digits
| 3 -> "thirty " + getDigits digits
| 4 -> "forty " + getDigits digits
| 5 -> "fifty " + getDigits digits
| _ -> getDigits tens + "ty " + getDigits digits
let getHundreds number =
match number with
| _ when number <= 0 -> String.Empty
| _ when number < 100 -> getTens number
| _ ->
let hundreds = number / 100
let tenstr =
if (number % 100) > 0 then
" and " + getTens(number % 100)
else String.Empty
String.Format("{0} hundred{1}", getDigits(hundreds), tenstr).TrimEnd()
let getThousands number =
let thousands = number / 1000
let thstr =
match thousands with
| _ when thousands > 999 -> failwith "Number too big"
| _ when thousands > 99 -> getHundreds thousands
| _ when thousands > 9 -> getTens thousands
| _ -> getDigits thousands
String.Format("{0} thousand {1}", thstr, getHundreds(number % 1000)).TrimEnd()
let Spell (number : int) =
match number.ToString().Length with
| _ when number <= 0 -> failwith "Value must be positive"
| 1 -> getDigits number
| 2 -> getTens number
| 3 -> getHundreds number
| _ -> getThousands number