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.


Option Explicit
 
Private small As Variant, tens As Variant, big As Variant
 
Sub Main()
    small = Array("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", _
                  "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", _
                  "eighteen", "nineteen")
    tens = Array("twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety")
    big = Array("thousand", "million", "billion")
 
    Dim tmpInt As Long
    tmpInt = Val(InputBox("Gimme a number!", "NOW!", Trim$(Year(Now)) & IIf(Month(Now) < 10, "0", "") & _
                 Trim$(Month(Now)) & IIf(Day(Now) < 10, "0", "") & Trim$(Day(Now))))
    MsgBox int2Text$(tmpInt)
End Sub
 
Function int2Text$(number As Long)
    Dim num As Long, outP As String, unit As Integer
    Dim tmpLng1 As Long
 
    If 0 = number Then
        int2Text$ = "zero"
        Exit Function
    End If
 
    num = Abs(number)
 
    Do
        tmpLng1 = num Mod 100
        Select Case tmpLng1
            Case 1 To 19
                outP = small(tmpLng1 - 1) + " " + outP
            Case 20 To 99
                Select Case tmpLng1 Mod 10
                    Case 0
                        outP = tens((tmpLng1 \ 10) - 2) + " " + outP
                    Case Else
                        outP = tens((tmpLng1 \ 10) - 2) + "-" + small(tmpLng1 Mod 10) + " " + outP
                End Select
        End Select
 
        tmpLng1 = (num Mod 1000) \ 100
        If tmpLng1 Then
            outP = small(tmpLng1 - 1) + " hundred " + outP
        End If
 
        num = num \ 1000
        If num < 1 Then Exit Do
 
        tmpLng1 = num Mod 1000
        If tmpLng1 Then outP = big(unit) + " " + outP
 
        unit = unit + 1
    Loop
 
    If number < 0 Then outP = "negative " & outP
 
    int2Text$ = Trim$(outP)
End Function