Click here to Skip to main content
15,886,724 members
Articles / Programming Languages / VBScript

Convert Currency To Words in Lakh, Crores, etc.

Rate me:
Please Sign up or sign in to vote.
3.26/5 (23 votes)
16 Feb 2004CPOL1 min read 184K   8.8K   24   15
Convert a given currency in words with Indian style digital grouping

Introduction

In the computing world, the convention used for grouping of digits is based on international standards which generally follows American practice. It means that digits are grouped in groups of two digits each, i.e. thousands, millions, billions, etc. However, people in India are habituated to groups of three, two, two... This groups form the thousands, lakhs, crores, etc. To solve this problem, a function has already been posted on CodeProject by me for converting any number to the groupings of thousands, lakhs, crores, etc. In continuation of this, the function here converts any number to the number in words with digit grouping of thousands, lakhs, crores, etc.

Background

This function is in Visual Basic and is based on the knowledge base article of Microsoft. The original article converts the number to the international digit grouping, i.e. thousands, millions, billions, etc.

Using the Code

As the function is written in Visual Basic, the same may be used in any application using Visual Basic as the scripting language. For using the code in Excel, Word, Access, simply copy and paste the full code in the Visual Basic module and use the function.

How It Works

The function is named as NumberToWords. This accepts a parameter of type variant. First, the function checks the existence of decimal in the number passed as parameter. If decimal exists, it constructs the word for paisa. After removing the decimal digits from the number, it converts digits, tens and hundreds by using routine ConvertDigits, ConvertTens and ConvertHundreds respectively. It constructs and returns a string containing the number in words with rupees and paisa as prefix and suffix.

History

  • 16th February, 2004: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Systems Engineer
India India
I love to learn new technology specially IT related. Programming is my hobby.

Comments and Discussions

 
GeneralBugs corrected in the function [modified] Pin
Vidyadhar B.C.14-Oct-07 22:05
Vidyadhar B.C.14-Oct-07 22:05 
GeneralConvert Currency To Words Solved all problems Pin
Nair Sreekumar30-Jul-07 23:25
Nair Sreekumar30-Jul-07 23:25 
GeneralBug in the code and a workaround Pin
kunmun2314-Jul-07 7:53
kunmun2314-Jul-07 7:53 
GeneralRe: Bug in the code and a workaround [modified] Pin
Vidyadhar B.C.14-Oct-07 17:55
Vidyadhar B.C.14-Oct-07 17:55 
It Doesn't work correctly for numbers less than 3 digits, along with that had some more bugs. otherwise the function is fantastic. Here are some modifications I did to debug the problem and it is working. Try it. Thanks for the author.
'*************************************************
'This function is modified(Debuged) By Vidyadhar B.C. (vidyadhar_bc@yahoo.com)
'
' Function for conversion of a Currency to words
' Parameter - accept a Currency
' Returns the number in words format
'*************************************************

Function CurrencyToWord(ByVal MyNumber)
Dim Temp
Dim Rupees, Paisa As String
Dim DecimalPlace, iCount
Dim Hundred, Words As String

Dim ch As String
Dim i As Integer
Dim count As Integer
Dim Alldigit As Balloon

ReDim Place(9) As String
Place(0) = " Thousand "
Place(2) = " Lakh "
Place(4) = " Crore "
Place(6) = " Arab "
Place(8) = " Kharab "
On Error Resume Next
' Convert MyNumber to a string, trimming extra spaces.

MyNumber = Trim(Str(MyNumber))
'==========================Modified================================
' count "." if it is more than 1
For i = 1 To Len(MyNumber)
If Mid$(MyNumber, i, 1) = "." Then
count = count + 1
If count > 1 Then
CurrencyToWord = "Invalid Currency....!"
Exit Function
End If
End If
Next i
' check all the digits are numbers
Alldigits = True
For i = 1 To Len(MyNumber)
' See if the next character is a non-digit.
ch = Mid$(MyNumber, i, 1)
If ch < "0" Or ch > "9" Or ch = "." Then
If ch <> "." Then
' This is not a digit.
Alldigits = False
Exit For
End If
End If
Next i

If Alldigits = False Then
CurrencyToWord = "Invalid Currency....!"
Exit Function
End If
'====================================================================

' Find decimal place.
DecimalPlace = InStr(MyNumber, ".")
'==========================Modified==================================
If DecimalPlace = 0 Then
If Len(MyNumber) > 13 Then
CurrencyToWord = "Value is too large, Function accepts 13 digits before decimal point"
Exit Function
End If
End If
'====================================================================
' If we find decimal place...
If DecimalPlace > 0 Then
'==========================Modified==================================
If DecimalPlace > 14 Then
CurrencyToWord = "Value is too large, Function accepts 13 digits before decimal point"
Exit Function
End If
'====================================================================
' Convert Paisa
Temp = Left(Mid(MyNumber, DecimalPlace + 1) & "00", 2)
Paisa = " and " & ConvertTens(Temp) & " Paisa Only"

' Strip off paisa from remainder to convert.
MyNumber = Trim(Left(MyNumber, DecimalPlace - 1))
End If

' Convert last 3 digits of MyNumber to Rupees in word.
Hundred = ConvertHundred(Right(MyNumber, 3))
'==========================Modified============
If Len(MyNumber) <= 2 Then
' Append leading zeros to number.
MyNumber = Right("000" & MyNumber, 3)
MyNumber = Left(MyNumber, Len(MyNumber) - 3)
Else
' Strip off last three digits
MyNumber = Left(MyNumber, Len(MyNumber) - 3)
End If
'====================================================================
iCount = 0
Do While MyNumber <> ""
'Strip last two digits
Temp = Right(MyNumber, 2)
If Len(MyNumber) = 1 Then
Words = ConvertDigit(Temp) & Place(iCount) & Words
MyNumber = Left(MyNumber, Len(MyNumber) - 1)

Else
'==========================Modified==================================
If Temp <> "00" Then
Words = ConvertTens(Temp) & Place(iCount) & Words
MyNumber = Left(MyNumber, Len(MyNumber) - 2)
Else
MyNumber = Left(MyNumber, Len(MyNumber) - 2)
End If
End If
iCount = iCount + 2
Loop

If Paisa = "" Then
CurrencyToWord = "Rupees " & Words & Hundred & " Only."
Else
CurrencyToWord = "Rupees " & Words & Hundred & Paisa
End If
'=====================================================================
End Function

' Conversion for Hundred
'*****************************************
Private Function ConvertHundred(ByVal MyNumber)
Dim Result As String

' Exit if there is nothing to convert.
If Val(MyNumber) = 0 Then Exit Function

' Append leading zeros to number.
MyNumber = Right("000" & MyNumber, 3)

' Do we have a Hundred place digit to convert?
If Left(MyNumber, 1) <> "0" Then
Result = ConvertDigit(Left(MyNumber, 1)) & " Hundred "
End If

' Do we have a tens place digit to convert?
If Mid(MyNumber, 2, 1) <> "0" Then
Result = Result & ConvertTens(Mid(MyNumber, 2))
Else
' If not, then convert the ones place digit.
Result = Result & ConvertDigit(Mid(MyNumber, 3))
End If

ConvertHundred = Trim(Result)
End Function

' Conversion for tens
'*****************************************
Private Function ConvertTens(ByVal MyTens)
Dim Result As String

' Is value between 10 and 19?
If Val(Left(MyTens, 1)) = 1 Then
Select Case Val(MyTens)
Case 10: Result = "Ten"
Case 11: Result = "Eleven"
Case 12: Result = "Twelve"
Case 13: Result = "Thirteen"
Case 14: Result = "Fourteen"
Case 15: Result = "Fifteen"
Case 16: Result = "Sixteen"
Case 17: Result = "Seventeen"
Case 18: Result = "Eighteen"
Case 19: Result = "Nineteen"
Case Else
End Select
Else
' .. otherwise it's between 20 and 99.
Select Case Val(Left(MyTens, 1))
Case 2: Result = "Twenty "
Case 3: Result = "Thirty "
Case 4: Result = "Forty "
Case 5: Result = "Fifty "
Case 6: Result = "Sixty "
Case 7: Result = "Seventy "
Case 8: Result = "Eighty "
Case 9: Result = "Ninety "
Case Else
End Select

' Convert ones place digit.
Result = Result & ConvertDigit(Right(MyTens, 1))
End If

ConvertTens = Result
End Function

Private Function ConvertDigit(ByVal MyDigit)
Select Case Val(MyDigit)
Case 1: ConvertDigit = "One"
Case 2: ConvertDigit = "Two"
Case 3: ConvertDigit = "Three"
Case 4: ConvertDigit = "Four"
Case 5: ConvertDigit = "Five"
Case 6: ConvertDigit = "Six"
Case 7: ConvertDigit = "Seven"
Case 8: ConvertDigit = "Eight"
Case 9: ConvertDigit = "Nine"
Case Else: ConvertDigit = ""
End Select
End Function



Vidyadhar
Questionhow do i use? Pin
pavanghai8-Mar-07 5:15
pavanghai8-Mar-07 5:15 
GeneralPls specify the function or the formula to be used in MS Excel/Access [modified] Pin
Suresh Kardar8-Oct-06 19:13
Suresh Kardar8-Oct-06 19:13 
GeneralDigit to word conversion program-reg Pin
S.PRAKASH7-Jul-06 20:17
S.PRAKASH7-Jul-06 20:17 
GeneralSolved my Problem Pin
tmistry23-May-06 21:22
tmistry23-May-06 21:22 
GeneralThousand Digit Not define Properly Pin
John dsoza28-Apr-06 1:57
John dsoza28-Apr-06 1:57 
GeneralUnable to use the function in access 2003 Pin
Dnyanraj16-Jan-06 23:51
Dnyanraj16-Jan-06 23:51 
GeneralWant to use the same for other application Pin
gotspatel1-Feb-05 3:08
gotspatel1-Feb-05 3:08 
GeneralProblem in Conversion Pin
Krishna Kumar Menon30-Aug-04 1:55
Krishna Kumar Menon30-Aug-04 1:55 
GeneralGreat, but... Pin
Snyp17-Feb-04 15:45
Snyp17-Feb-04 15:45 
GeneralRe: Great, but... Pin
P.K.Agarwal19-Feb-04 16:06
P.K.Agarwal19-Feb-04 16:06 
GeneralRe: Great, but... Pin
P.K.Agarwal19-Feb-04 16:10
P.K.Agarwal19-Feb-04 16:10 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.