Module Nums2Words

    
Private levels() As String = {""" Thousand "" Million "" Billion "" Trillion "}

    
Public Function convert(ByVal inputNum As IntegerAs String
        If 
inputNum Then Return "Zero"

        
Dim input As String = CStr(inputNum)
        
Dim output As String = ""
        
Dim pos As Integer = input.Length - 1
        
Dim chunk As String = ""
        
Dim level As Integer = 0

        
Do
            
chunk = input.Substring(pos, 1) & chunk
            
If chunk.Length Or pos Then
                
output d(chunk) & levels(level) & output
                chunk 
""
                
level +1
            
End If

            If 
pos Then Exit Do
            
pos -1
        
Loop

        Do
            If 
output.IndexOf("  ") <Then Exit Do
            
output output.Replace("  "" ")
        
Loop

        Return 
output
    
End Function

    Private Function 
d(ByVal inputNum As IntegerAs String
        If 
inputNum Then Return ""

        
Dim input As String = CStr(inputNum)
        
Dim output As String = ""

        
If input.Length Then
            
output convertZeroToNineteen(input.Substring(01)) & "Hundred "
            
input = input.Substring(1)
        
End If

        Dim 
As Integer = CInt(input)
        
If x < 20 Then
            
output &convertZeroToNineteen(x)
        
Else
            
output &convertTensDigit(input.Substring(01))
            
If CInt(input.Substring(1)) > Then
                
output output.TrimEnd & "-" & convertZeroToNineteen(input.Substring(1)).TrimStart
            
Else
                
output &convertZeroToNineteen(input.Substring(1))
            
End If
        End If

        Return 
output
    
End Function

    Private Function 
convertZeroToNineteen(ByVal inputNum As IntegerAs String
        Select Case 
inputNum
            
Case Return ""
            
Case Return " One "
            
Case Return " Two "
            
Case Return " Three "
            
Case Return " Four "
            
Case Return " Five "
            
Case Return " Six "
            
Case Return " Seven "
            
Case Return " Eight "
            
Case Return " Nine "
            
Case 10 Return " Ten "
            
Case 11 Return " Eleven "
            
Case 12 Return " Twelve "
            
Case 13 Return " Thirteen "
            
Case 14 Return " Fourteen "
            
Case 15 Return " Fifteen "
            
Case 16 Return " Sixteen "
            
Case 17 Return " Seventeen "
            
Case 18 Return " Eighteen "
            
Case 19 Return " Nineteen "
        
End Select
        Return 
""
    
End Function

    Private Function 
convertTensDigit(ByVal inputNum As IntegerAs String
        Select Case 
inputNum
            
Case Return " Twenty "
            
Case Return " Thirty "
            
Case Return " Forty "
            
Case Return " Fifty "
            
Case Return " Sixty "
            
Case Return " Seventy "
            
Case Return " Eighty "
            
Case Return " Ninety "
        
End Select
        Return 
""
    
End Function
End Module

Colorized by: CarlosAg.CodeColorizer