Task

Show how to spell out a number in English.

You can use a preexisting implementation or roll your own, but you should support inputs up to at least one million (or the maximum value of your language's default bounded integer type, if that's less).

Support for inputs other than positive integers (like zero, negative integers, and floating-point numbers) is optional.



Related task

   Spelling of ordinal numbers.


Loop {                                 ; TEST LOOP 
    n = 
    Random Digits, 1, 36               ; random number with up to 36 digits 
    Loop %Digits% { 
        Random Digit, 0, 9             ; can have leading 0s 
        n .= Digit 
    } 
    MsgBox 1, Number Names, % PrettyNumber(n) "`n`n" Spell(n) "`n`n" 
    IfMsgBox Cancel, Break 
} 
 
Spell(n) { ; recursive function to spell out the name of a max 36 digit integer, after leading 0s removed 
    Static p1=" thousand ",p2=" million ",p3=" billion ",p4=" trillion ",p5=" quadrillion ",p6=" quintillion " 
         , p7=" sextillion ",p8=" septillion ",p9=" octillion ",p10=" nonillion ",p11=" decillion " 
         , t2="twenty",t3="thirty",t4="forty",t5="fifty",t6="sixty",t7="seventy",t8="eighty",t9="ninety" 
         , o0="zero",o1="one",o2="two",o3="three",o4="four",o5="five",o6="six",o7="seven",o8="eight" 
         , o9="nine",o10="ten",o11="eleven",o12="twelve",o13="thirteen",o14="fourteen",o15="fifteen" 
         , o16="sixteen",o17="seventeen",o18="eighteen",o19="nineteen" 
 
    n :=RegExReplace(n,"^0+(\d)","$1") ; remove leading 0s from n 
 
    If  (11 < d := (StrLen(n)-1)//3)   ; #of digit groups of 3 
        Return "Number too big" 
 
    If (d)                             ; more than 3 digits 
        Return Spell(SubStr(n,1,-3*d)) p%d% ((s:=SubStr(n,1-3*d)) ? ", " Spell(s) : "") 
 
    i := SubStr(n,1,1) 
    If (n > 99)                        ; 3 digits 
        Return o%i% " hundred" ((s:=SubStr(n,2)) ? " and " Spell(s) : "") 
 
    If (n > 19)                        ; n = 20..99 
        Return t%i% ((o:=SubStr(n,2)) ? "-" o%o% : "") 
 
    Return o%n%                        ; n = 0..19 
} 
 
PrettyNumber(n) { ; inserts thousands separators into a number string 
    Return RegExReplace( RegExReplace(n,"^0+(\d)","$1"), "\G\d+?(?=(\d{3})+(?:\D|$))", "$0,")
}