Click here to Skip to main content
Licence 
First Posted 11 Oct 2006
Views 67,912
Bookmarked 25 times

How to convert a numeric value or currency to English words using C#

By | 11 Oct 2006 | Article
This article includes a sample application that will show you how to convert a numeric value to an English word representation.It handles numeric values up to a billion and may be extended beyond

Introduction

After looking around the web for this functionality and failing to get an answer to my problem. I decided to spare some minutes and develop this functionality up to my requirement.

I've decided to share with developers out who may require it.

The program accepts numbers/numeric values as input and outputs an an English word representation.It accepts numbers ranging from 1 to some billions.

Here is the code:

using System;

namespace custom.util

{

public class NumberToEnglish

{

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 (Convert.ToInt32(points) > 0)

{

andStr = (isCurrency)?("and"):("point");// just to separate whole numbers from points/cents

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;

place = " Hundred ";

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 = ones(digit);

}

cts += " " + engOne;

}

return cts;

}

}

}

 

 

 

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Fred.B

Web Developer

Uganda Uganda

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionGood work PinmemberMenon Santosh19:51 12 Oct '11  
GeneralFails on 1020 Pinmemberdhilsen3019:08 20 Aug '10  
GeneralFormatting Code PinmentorKunalChowdhury8:26 21 Jul '10  
GeneralThanks mate Pinmemberdm7916:05 20 Jun '10  
GeneralFails on 10020 Pinmemberarun_kvm18:05 18 Nov '09  
GeneralThanks for the code PinmemberBrian Davis10:42 12 Aug '08  
GeneralWARNING: FAILS ON 10001, 1000001 Pinmemberfix_a_fix3:28 3 Jun '08  
GeneralSimpler solution Pinmembermarschills4:19 31 Jan '08  
Generalgreat Pinmemberamirmuthu4:47 17 Oct '07  
GeneralHack for Negative Numbers Pinmembersandman_68115:47 30 Jul '07  
GeneralNice One PinmemberBoipelo0:53 27 Mar '07  
Generalthanks Bill Pinmemberteligaurav2:05 9 Feb '07  
GeneralCheck this Out PinmemberBill Pierce9:48 11 Oct '06  
GeneralRe: Check this Out Pinmemberfbyk21:58 11 Oct '06  

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

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

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120517.1 | Last Updated 11 Oct 2006
Article Copyright 2006 by Fred.B
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid