NumToString


Description:
The function NumToString writes out any number, up to about 920 trillion, the limit of the Currency variable type, in English words. It only writes out the integer portion of the number. The DollarToString function does the same, but places the word dollars after the string and also writes out the fractional part of the value as the cents.

1/8/2001: Added DateToString and NumToStringTh (ie, "23" -> "twenty-third") helper functions.

7/20/2002: Corrected error in DollarToString that limited the range of values.
 
Code:
Public Function DollarToString(ByVal nAmount As Currency) As String
'Example:
'  DollarToString(5.99) = " five dollars and ninety-nine cents"
    Dim nDollar As Currency
    Dim nCent As Currency
    
    nDollar = Int(nAmount)
    nCent = (Abs(nAmount) - Int(Abs(nAmount))) * 100
    
    DollarToString = NumToString(nDollar) & " dollar"
    
    If Abs(nDollar) <> 1 Then
        DollarToString = DollarToString & "s"
    End If
    
    DollarToString = DollarToString & " and" & _
    NumToString(nCent) & " cent"
    
    If Abs(nCent) <> 1 Then
        DollarToString = DollarToString & "s"
    End If
End Function

Public Function NumToString(ByVal nNumber As Currency) As String
'Example: NumToString(123) = " one hundred twenty-three"
    Dim bNegative As Boolean
    Dim bHundred As Boolean

    If nNumber < 0 Then
        bNegative = True
    End If

    nNumber = Abs(Int(nNumber))
    If nNumber < 1000 Then
        If nNumber \ 100 > 0 Then
            NumToString = NumToString & _
                NumToString(nNumber \ 100) & " hundred"
            bHundred = True
        End If
        nNumber = nNumber - ((nNumber \ 100) * 100)
        Dim bNoFirstDigit As Boolean
        bNoFirstDigit = False
        Select Case nNumber \ 10
            Case 0
                Select Case nNumber Mod 10
                    Case 0
                        If Not bHundred Then
                            NumToString = NumToString & " zero"
                        End If
                    Case 1: NumToString = NumToString & " one"
                    Case 2: NumToString = NumToString & " two"
                    Case 3: NumToString = NumToString & " three"
                    Case 4: NumToString = NumToString & " four"
                    Case 5: NumToString = NumToString & " five"
                    Case 6: NumToString = NumToString & " six"
                    Case 7: NumToString = NumToString & " seven"
                    Case 8: NumToString = NumToString & " eight"
                    Case 9: NumToString = NumToString & " nine"
                End Select
                bNoFirstDigit = True
            Case 1
                Select Case nNumber Mod 10
                    Case 0: NumToString = NumToString & " ten"
                    Case 1: NumToString = NumToString & " eleven"
                    Case 2: NumToString = NumToString & " twelve"
                    Case 3: NumToString = NumToString & " thirteen"
                    Case 4: NumToString = NumToString & " fourteen"
                    Case 5: NumToString = NumToString & " fifteen"
                    Case 6: NumToString = NumToString & " sixteen"
                    Case 7: NumToString = NumToString & " seventeen"
                    Case 8: NumToString = NumToString & " eighteen"
                    Case 9: NumToString = NumToString & " nineteen"
                End Select
                bNoFirstDigit = True
            Case 2: NumToString = NumToString & " twenty"
            Case 3: NumToString = NumToString & " thirty"
            Case 4: NumToString = NumToString & " forty"
            Case 5: NumToString = NumToString & " fifty"
            Case 6: NumToString = NumToString & " sixty"
            Case 7: NumToString = NumToString & " seventy"
            Case 8: NumToString = NumToString & " eighty"
            Case 9: NumToString = NumToString & " ninety"
        End Select
        If Not bNoFirstDigit Then
            If nNumber Mod 10 <> 0 Then
                NumToString = NumToString & "-" & _
                    Mid(NumToString(nNumber Mod 10), 2)
            End If
        End If
    Else
        Dim nTemp As Currency
        nTemp = 10 ^ 12 'trillion
        Do While nTemp >= 1
            If nNumber >= nTemp Then
                NumToString = NumToString & _
                    NumToString(Int(nNumber / nTemp))
                Select Case Int(Log(nTemp) / Log(10) + 0.5)
                    Case 12: NumToString = NumToString & " trillion"
                    Case 9: NumToString = NumToString & " billion"
                    Case 6: NumToString = NumToString & " million"
                    Case 3: NumToString = NumToString & " thousand"
                End Select
                nNumber = nNumber - (Int(nNumber / nTemp) * nTemp)
            End If
            nTemp = nTemp / 1000
        Loop
    End If
    If bNegative Then
        NumToString = " negative " & NumToString
    End If
End Function

Public Function NumToStringTh(ByVal nNumber As Currency) As String
'Example: NumToStringTh(123) = " one hundred twenty-third"

    Dim sNum As String
    Dim sExtra As String
    Dim nSpace As String

    'Convert the number
    sNum = NumToString(nNumber)
    'Find the location of the last space or dash
    nSpace = Len(sNum)
    
    Do Until Mid(sNum, nSpace, 1) = " " Or _
        Mid(sNum, nSpace, 1) = "-"
        nSpace = nSpace - 1
    Loop

    sExtra = Mid(sNum, nSpace + 1)
    sNum = Mid(sNum, 1, nSpace)
    
    'Conver the last word ("one" -> "first", etc)
    Select Case sExtra
        Case "hundred":   NumToStringTh = sNum & "hundredth"
        Case "zero" 'no such thing as 'zeroth'
            NumToStringTh = sNum & "zero"
        Case "one":       NumToStringTh = sNum & "first"
        Case "two":       NumToStringTh = sNum & "second"
        Case "three":     NumToStringTh = sNum & "third"
        Case "four":      NumToStringTh = sNum & "fourth"
        Case "five":      NumToStringTh = sNum & "fifth"
        Case "six":       NumToStringTh = sNum & "sixth"
        Case "seven":     NumToStringTh = sNum & "seventh"
        Case "eight":     NumToStringTh = sNum & "eighth"
        Case "nine":      NumToStringTh = sNum & "ninth"
        Case "ten":       NumToStringTh = sNum & "tenth"
        Case "eleven":    NumToStringTh = sNum & "eleventh"
        Case "twelve":    NumToStringTh = sNum & "twelfth"
        Case "thirteen":  NumToStringTh = sNum & "thirteenth"
        Case "fourteen":  NumToStringTh = sNum & "fourteenth"
        Case "fifteen":   NumToStringTh = sNum & "fifteenth"
        Case "sixteen":   NumToStringTh = sNum & "sixteenth"
        Case "seventeen": NumToStringTh = sNum & "seventeenth"
        Case "eighteen":  NumToStringTh = sNum & "eighteenth"
        Case "nineteen":  NumToStringTh = sNum & "nineteenth"
        Case "twenty":    NumToStringTh = sNum & "twentieth"
        Case "thirty":    NumToStringTh = sNum & "thirtieth"
        Case "forty":     NumToStringTh = sNum & "fortieth"
        Case "fifty":     NumToStringTh = sNum & "fiftieth"
        Case "sixty":     NumToStringTh = sNum & "sixtieth"
        Case "seventy":   NumToStringTh = sNum & "seventieth"
        Case "eighty":    NumToStringTh = sNum & "eightieth"
        Case "ninety":    NumToStringTh = sNum & "ninetieth"
        Case "trillion":  NumToStringTh = sNum & "trillionth"
        Case "billion":   NumToStringTh = sNum & "billionth"
        Case "million":   NumToStringTh = sNum & "millionth"
        Case "thousand":  NumToStringTh = sNum & "thousandth"
        Case Else 'This shouldn't happen, but just in case
            NumToStringTh = NumToString(nNumber)
    End Select
    
End Function

Public Function DateToString(FromDate As String) As String
'Example: ' DateToString(#1/1/2001#) = "January the first, two thousand one"

    DateToString = Format(FromDate, "mmmm") & " the" & _
        NumToStringTh(DatePart("d", FromDate)) & "," & _
        NumToString(DatePart("yyyy", FromDate))
        
End Function
 
Sample Usage:
 
    Debug.Print DollarToString(1234.11)
    Debug.Print NumToString(-54321)