StrataFrame Forum

Function to convert numbers to words

http://forum.strataframe.net/Topic22552.aspx

By Edhy Rijo - 3/30/2009

I had the need for such a function and Juan Carlos posted a link to a thread with the function below, so I pasted in here for future reference:



Public Function ConvertMoneyToText(ByVal value As String) As String



'Takes a string value that translates as a decimal value of up to one pentillion (?) dollars.

'Note: Removing the comma for European currency will remove the decimal pointer.



value = value.Replace(",", "").Replace("$", "")

value = value.TrimStart("0")



Dim decimalCount As Int32 = 0

For x As Int32 = 0 To value.Length - 1

If value(x).ToString = "." Then

decimalCount += 1

If decimalCount > 1 Then Throw New ArgumentException("Only monetary values are accepted")

End If



If Not (Char.IsDigit(value(x)) Or value(x).ToString = ".") And Not (x = 0 And value(x).ToString = "-") Then

Throw New ArgumentException("Only monetary values are accepted")

End If

Next



Dim returnValue As String = ""

Dim parts() As String = value.Split(".")



If parts.Length > 1 Then

parts(1) = parts(1).Substring(0, 2).ToCharArray 'Truncates -- doesn't round.

End If



Dim IsNegative As Boolean = parts(0).Contains("-")

If parts(0).Replace("-", "").Length > 18 Then

Throw New ArgumentException("Maximum value is $999,999,999,999,999,999.99")

End If



If IsNegative Then

parts(0) = parts(0).Replace("-", "")

returnValue &= "Minus "

End If



'If you know the names of what is beyond quadrillion and feel the urge to do the

' rediculous just follow the pattern below.

If parts(0).Length > 15 Then

returnValue &= HundredsText(parts(0).PadLeft(18, "0").Substring(0, 3)) & "Quadrillion "

returnValue &= HundredsText(parts(0).PadLeft(18, "0").Substring(3, 3)) & "Trillion "

returnValue &= HundredsText(parts(0).PadLeft(18, "0").Substring(6, 3)) & "Billion "

returnValue &= HundredsText(parts(0).PadLeft(18, "0").Substring(9, 3)) & "Million "

returnValue &= HundredsText(parts(0).PadLeft(18, "0").Substring(12, 3)) & "Thousand "

ElseIf parts(0).Length > 12 Then

returnValue &= HundredsText(parts(0).PadLeft(15, "0").Substring(0, 3)) & "Trillion "

returnValue &= HundredsText(parts(0).PadLeft(15, "0").Substring(3, 3)) & "Billion "

returnValue &= HundredsText(parts(0).PadLeft(15, "0").Substring(6, 3)) & "Million "

returnValue &= HundredsText(parts(0).PadLeft(15, "0").Substring(9, 3)) & "Thousand "

ElseIf parts(0).Length > 9 Then

returnValue &= HundredsText(parts(0).PadLeft(12, "0").Substring(0, 3)) & "Billion "

returnValue &= HundredsText(parts(0).PadLeft(12, "0").Substring(3, 3)) & "Million "

returnValue &= HundredsText(parts(0).PadLeft(12, "0").Substring(6, 3)) & "Thousand "

ElseIf parts(0).Length > 6 Then

returnValue &= HundredsText(parts(0).PadLeft(9, "0").Substring(0, 3)) & "Million "

returnValue &= HundredsText(parts(0).PadLeft(9, "0").Substring(3, 3)) & "Thousand "

ElseIf parts(0).Length > 3 Then

returnValue &= HundredsText(parts(0).PadLeft(6, "0").Substring(0, 3)) & "Thousand "

End If



Dim hundreds As String = parts(0).PadLeft(3, "0")

hundreds = hundreds.Substring(hundreds.Length - 3, 3)

If CInt(hundreds) <> 0 Then

If CInt(hundreds) < 100 AndAlso parts.Length > 1 Then returnValue &= "and "

returnValue &= HundredsText(hundreds) & "Dollar"

If CInt(hundreds) <> 1 Then returnValue &= "s"

If parts.Length > 1 AndAlso CInt(parts(1)) <> 0 Then returnValue &= " and "

Else

returnValue &= " No Dollars"

If parts.Length > 1 AndAlso CInt(parts(1)) <> 0 Then returnValue &= " and "

End If



If parts.Length = 2 Then

If CInt(parts(1)) <> 0 Then

returnValue &= HundredsText(parts(1).PadLeft(3, "0"))

returnValue &= "Cent"

If CInt(parts(1)) <> 1 Then returnValue &= "s"

End If

End If



Return returnValue



End Function



Private Function HundredsText(ByVal value As String) As String



Dim Tens As String() = {"Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"}

Dim Ones As String() = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"}



Dim returnValue As String = ""

Dim IsSingleDigit As Boolean = True



If CInt(value(0).ToString) <> 0 Then

returnValue &= Ones(CInt(value(0).ToString) - 1) & " Hundred "

IsSingleDigit = False

End If



If CInt(value(1).ToString) > 1 Then

returnValue &= Tens(CInt(value(1).ToString) - 1) & " "

If CInt(value(2).ToString) <> 0 Then

returnValue &= Ones(CInt(value(2).ToString) - 1) & " "

End If

ElseIf CInt(value(1).ToString) = 1 Then

returnValue &= Ones(CInt(value(1).ToString & value(2).ToString) - 1) & " "

Else

If CInt(value(2).ToString) <> 0 Then

If Not IsSingleDigit Then

returnValue &= "and "

End If

returnValue &= Ones(CInt(value(2).ToString) - 1) & " "

End If

End If



Return returnValue



End Function