Converting Currency in Digits to Currency in Words
The other day, I came across another issue related to Software Dev that demanded conversion of currency in digit to Currency in words. Since it was an urgent CR so I took a code from the site below.
http://www.eggheadcafe.com/community/aspnet/2/10018714/convert-number--into-word.aspx
But few days latter the QA figured out a bug where my application read 1024 as One thousand and Hundred and Twenty Four and I knew I was in a deep trouble this time, since the code wasn't mine and I was answerable. So I had to understand the code and make some +ve amendments and I am happy that I havent lost the flair for programming that I had during my graduation. So below is the code courtesy of the site above.
http://www.eggheadcafe.com/community/aspnet/2/10018714/convert-number--into-word.aspx
But few days latter the QA figured out a bug where my application read 1024 as One thousand and Hundred and Twenty Four and I knew I was in a deep trouble this time, since the code wasn't mine and I was answerable. So I had to understand the code and make some +ve amendments and I am happy that I havent lost the flair for programming that I had during my graduation. So below is the code courtesy of the site above.
#region Code For Currency Conversion public String changeNumericToWords(double numb) { String num = numb.ToString(); return changeToWords(num, false); } public String changeCurrencyToWords(String numb) { return changeToWords(numb, true); } public String changeNumericToWords(String numb) { return changeToWords(numb, false); } public String changeCurrencyToWords(double numb) { return changeToWords(numb.ToString(), true); } private String changeToWords(String numb, bool isCurrency) { String val = "", wholeNo = numb, points = "", andStr = "", pointStr = ""; String endStr = (isCurrency) ? ("Only") : (""); try { int decimalPlace = numb.IndexOf("."); if (decimalPlace > 0) { wholeNo = numb.Substring(0, decimalPlace); points = numb.Substring(decimalPlace + 1); if (points.Length == Constants.ONE) { points = points + Constants.ZERO; } //VI Code: Modified on 2/12/2009 pointStr = points + "/100"; if (Convert.ToInt32(points) > 0) { andStr = (isCurrency) ? ("and ") : ("point ");// just to separate whole numbers from points/cents //VI Code:Commented lines below on 2/12/2009 //endStr = (isCurrency) ? ("Cents " + endStr) : (""); //pointStr = translateCents(points); } } val = String.Format("{0} {1}{2} {3}", translateWholeNumber(wholeNo).Trim(), andStr, pointStr, endStr); } catch { ;} return val; } private String translateWholeNumber(String number) { string word = ""; try { bool beginsZero = false;//tests for 0XX bool isDone = false;//test if already translated double dblAmt = (Convert.ToDouble(number)); //if ((dblAmt > 0) && number.StartsWith("0")) if (dblAmt > 0) {//test for zero or digit zero in a nuemric beginsZero = number.StartsWith("0"); int numDigits = number.Length; int pos = 0;//store digit grouping String place = "";//digit grouping name:hundres,thousand,etc... switch (numDigits) { case 1://ones' range word = ones(number); isDone = true; break; case 2://tens' range word = tens(number); isDone = true; break; case 3://hundreds' range pos = (numDigits % 3) + 1; //Code Modified by Vaq if (!beginsZero) { place = " Hundred "; } else { } //Code Commented By VAQ //place = " Hundred "; //Comments End break; case 4://thousands' range case 5: case 6: pos = (numDigits % 4) + 1; place = " Thousand "; break; case 7://millions' range case 8: case 9: pos = (numDigits % 7) + 1; place = " Million "; break; case 10://Billions's range pos = (numDigits % 10) + 1; place = " Billion "; break; //add extra case options for anything above Billion... default: isDone = true; break; } if (!isDone) {//if transalation is not done, continue...(Recursion comes in now!!) word = translateWholeNumber(number.Substring(0, pos)) + place + translateWholeNumber(number.Substring(pos)); //check for trailing zeros if (beginsZero) word = " and " + word.Trim(); } //ignore digit grouping names if (word.Trim().Equals(place.Trim())) word = ""; } } catch { ;} return word.Trim(); } private String tens(String digit) { int digt = Convert.ToInt32(digit); String name = null; switch (digt) { case 10: name = "Ten"; break; case 11: name = "Eleven"; break; case 12: name = "Twelve"; break; case 13: name = "Thirteen"; break; case 14: name = "Fourteen"; break; case 15: name = "Fifteen"; break; case 16: name = "Sixteen"; break; case 17: name = "Seventeen"; break; case 18: name = "Eighteen"; break; case 19: name = "Nineteen"; break; case 20: name = "Twenty"; break; case 30: name = "Thirty"; break; case 40: name = "Fourty"; break; case 50: name = "Fifty"; break; case 60: name = "Sixty"; break; case 70: name = "Seventy"; break; case 80: name = "Eighty"; break; case 90: name = "Ninety"; break; default: if (digt > 0) { name = tens(digit.Substring(0, 1) + "0") + " " + ones(digit.Substring(1)); } break; } return name; } private String ones(String digit) { int digt = Convert.ToInt32(digit); String name = ""; switch (digt) { case 1: name = "One"; break; case 2: name = "Two"; break; case 3: name = "Three"; break; case 4: name = "Four"; break; case 5: name = "Five"; break; case 6: name = "Six"; break; case 7: name = "Seven"; break; case 8: name = "Eight"; break; case 9: name = "Nine"; break; } return name; } private String translateCents(String cents) { String cts = "", digit = "", engOne = ""; for (int i = 0; i < cents.Length; i++) { digit = cents[i].ToString(); if (digit.Equals("0")) { engOne = "Zero"; } else { //engOne += digit; engOne = ones(digit); } cts += " " + engOne; } return cts; } #endregion
My friend suggested me to visit your blog. Very well explained. I would like to say that it is very interesting to read your blog.
ReplyDeletethanx guys and sorry for the belated response.
ReplyDelete