Click here to Skip to main content
15,867,568 members
Articles / Programming Languages / C#
Alternative
Tip/Trick

Converting numbers to the word equivalent.

Rate me:
Please Sign up or sign in to vote.
4.82/5 (17 votes)
19 Aug 2010CPOL 17.4K   5   11
I'm sorry, but that's a horrible way to do it...Here is what I would do... public class NumberToWords { public static string ConvertToWords(int Number) { //Split the string into 3 part pieces string numStr = Number.ToString(); ...
I'm sorry, but that's a horrible way to do it...

Here is what I would do...
    public class NumberToWords
    {

        public static string ConvertToWords(int Number)
        {
            //Split the string into 3 part pieces
            string numStr = Number.ToString();
            List<string> numParts = new List<string>();

            string currentStr = "";

            int t = 0;
            for (int i = numStr.Length - 1; i >= 0; i--)
            {
                t++;
                currentStr = numStr[i] + currentStr;

                if (t == 3)
                {
                    currentStr = "," + currentStr;
                    t = 0;
                }
            }

            if (currentStr.StartsWith(","))
                currentStr = currentStr.Remove(0, 1);

            string[] vals = currentStr.Split(',');

            numParts.AddRange(vals);

            List<string> outString = new List<string>();

            List<string> delims = new List<string>();

            delims.Add("");

            if (numParts.Count >= 2)
                delims.Add("Thousand");

            if (numParts.Count >= 3)
                delims.Add("Million");

            if (numParts.Count >= 4)
                delims.Add("Billion");

            if (numParts.Count >= 5)
                delims.Add("Trillion");

            int j = delims.Count - 1;

            for (int i = 0; i < numParts.Count; i++)
            {
                int num = int.Parse(numParts[i]);

                string temp = "";


                if (num >= 100)
                    temp = ConvertThreeDigits(num);
                else if (num >= 10)
                    temp = ConvertTwoDigits(num);
                else
                {
                    if (i == 0)
                    {
                        temp = ConvertOneDigit(num);
                    }
                }
 

                temp += " " + delims[j];
                j--;

                outString.Add(temp);
            }

            string retString = string.Join(" ", outString.ToArray());

            return retString;
        }

        private static string ConvertThreeDigits(int Number)
        {
            int firstDigit = Number / 100;
            int lastDigits = Number - (firstDigit * 100);

            if (lastDigits == 0)
                return ConvertOneDigit(firstDigit) + " Hundred";
            else if (lastDigits < 9)
                return ConvertOneDigit(firstDigit) + " Hundred " + ConvertOneDigit(lastDigits);
            else
                return ConvertOneDigit(firstDigit) + " Hundred " + ConvertTwoDigits(lastDigits);
        }

        private static string ConvertTwoDigits(int Number)
        {
            int firstDigit = Number / 10;
            int secondDigit = Number - (firstDigit * 10);

            if (Number >= 10 && Number < 20)
            {
                if (secondDigit == 4 || secondDigit == 6 ||
                    secondDigit >= 7)
                {
                    return ConvertOneDigit(secondDigit) + "teen";
                }
                else
                {
                    switch (secondDigit)
                    {
                        case 0:
                            return "Ten";
                        case 1:
                            return "Eleven";
                        case 2:
                            return "Twelve";
                        case 3:
                            return "Thirteen";
                        case 5:
                            return "Fifteen";
                        default:
                            return "ERROR";
                    }
                }
            }
            else
            {
                string firstPart = "";

                switch (firstDigit)
                {
                    case 2:
                        firstPart = "Twenty";
                        break;
                    case 3:
                        firstPart = "Thirty";
                        break;
                    case 4:
                        firstPart = "Fourty";
                        break;
                    case 5:
                        firstPart = "Fifty";
                        break;
                    case 6:
                        firstPart = "Sixty";
                        break;
                    case 7:
                        firstPart = "Seventy";
                        break;
                    case 8:
                        firstPart = "Eighty";
                        break;
                    case 9:
                        firstPart = "Ninty";
                        break;
                    default:
                        return "ERROR";
                }

                if (secondDigit > 0)
                    return firstPart + "-" + ConvertOneDigit(secondDigit);
                else
                    return firstPart;
            }
        }

        private static string ConvertOneDigit(int Number)
        {
            switch (Number)
            {
                case 0:
                    return "Zero";
                case 1:
                    return "One";
                case 2:
                    return "Two";
                case 3:
                    return "Three";
                case 4:
                    return "Four";
                case 5:
                    return "Five";
                case 6:
                    return "Six";
                case 7:
                    return "Seven";
                case 8:
                    return "Eight";
                case 9:
                    return "Nine";
                default:
                    return "ERROR";
            }
        }
    }
</string></string></string></string></string></string>

License

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


Written By
President 6D Systems LLC
United States United States
I studied Software Engineering at Milwaukee School of Engineering for 2 years before switching to Management of Information Systems for a more business oriented approach. I've been developing software since the age of 14, and have waded through languages such as QBasic, TrueBasic, C, C++, Java, VB6, VB.NET, C#, etc. I've been developing professionally since 2002 in .NET.

Comments and Discussions

 
GeneralReason for my vote of 3 rtyhrhrjht Pin
Alireza Eskandari19-Apr-11 5:03
professionalAlireza Eskandari19-Apr-11 5:03 
GeneralI wasn't real careful with things like spelling and commenti... Pin
Ron Beyer24-Aug-10 4:53
professionalRon Beyer24-Aug-10 4:53 
GeneralI saw some COBOL code for this nearly 30 years ago and it wa... Pin
Yeoville23-Aug-10 12:36
Yeoville23-Aug-10 12:36 
I saw some COBOL code for this nearly 30 years ago and it was full of errors, simply because English is not a very regular language. Here "forty" and "ninety" have been misspelt (typos?). And usually we say "twelve thousand, three hundred..." as opposed to "twelve thousand and three hundred...". And not even stepping into the discussion of English and US versions of "billion"!
GeneralReason for my vote of 5 Simplicity, robustness. Could improv... Pin
Kamran Behzad23-Aug-10 12:32
Kamran Behzad23-Aug-10 12:32 
GeneralCan I please start the 1000,000,000 is a thousand million no... Pin
Member 468474523-Aug-10 10:54
Member 468474523-Aug-10 10:54 
GeneralReason for my vote of 2 poor Pin
Toli Cuturicu22-Aug-10 7:42
Toli Cuturicu22-Aug-10 7:42 
GeneralReason for my vote of 5 best Pin
divyang448221-Aug-10 9:28
professionaldivyang448221-Aug-10 9:28 
GeneralIf you are going to post code, at least check it works! Try ... Pin
OriginalGriff20-Aug-10 23:20
mveOriginalGriff20-Aug-10 23:20 
Generallol.. you people fail to see Silic0re09 sarcasm! You're even... Pin
Simon Dufour20-Aug-10 8:23
Simon Dufour20-Aug-10 8:23 
GeneralReason for my vote of 1 Failed to detect sarcarm. Pin
leppie19-Aug-10 22:05
leppie19-Aug-10 22:05 
GeneralYou missed the joke my friend :) Pin
Mustafa Ismail Mustafa19-Aug-10 9:26
Mustafa Ismail Mustafa19-Aug-10 9:26 

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.