Reader Level:
Articles

Converting Numbers to Words using the Indian Numbering System

By Vulpes on May 22, 2011
In this article, I'd like to present a similar program using the Indian numbering system. This system differs from the US/UK systems in that it doesn't use 'millions' but instead uses 'lakhs' and 'crores' to represent multiples of 100 thousand and 10 million respectively.
  • 0
  • 0
  • 11702

Introduction

In an earlier article (http://www.c-sharpcorner.com/UploadFile/b942f9/6362/?ArticleID=0910264a-898f-49be-84b5-38b5b5f83a15) , I presented a simple program for converting numbers to words using the US or UK numbering systems. The program was restricted to integers in the range of an Int32 (about plus or minus 2 billion) which I believe is the most useful case.

In this article, I'd like to present a similar program using the Indian numbering system. This system differs from the US/UK systems in that it doesn't use 'millions' but instead uses 'lakhs' and 'crores' to represent multiples of 100 thousand and 10 million respectively.

A billion can be represented by the term 'arab' though I understand that this is seldom used in practice and most Indian people prefer to say 100 crore.
However, for the sake of completeness, the program has an option to use 'arab' and also to separate different number denominations with 'and' as in the UK numbering system.

Source Code

using System;

class Program
{
    static void Main()
    {
        string input;
        int number;
        bool isValid;
        bool useAnd = false;
        bool useArab = false;

        Console.WriteLine("\nEnter '0' to quit the program at any time\n");

        while (true)
        {
            Console.Write("\nUse 'and' as separator y/n : ");
            input = Console.ReadLine();
            if (!(input.ToLower() == "y" || input.ToLower() == "n"))
                Console.WriteLine("\n  Must be 'y' or 'n', please try again\n");
            else
            {
                if (input.ToLower() == "y") useAnd = true;
                Console.WriteLine();
                break;
            }
        }

        while (true)
        {
            Console.Write("\nUse 'Arab' instead of '100 Crore' y/n : ");
            input = Console.ReadLine();
            if (!(input.ToLower() == "y" || input.ToLower() == "n"))
                Console.WriteLine("\n  Must be 'y' or 'n', please try again\n");
            else
            {
                if (input.ToLower() == "y") useArab = true;
                Console.WriteLine("\n");
                break;
            }
        }         

        do
        {
            Console.Write("Enter integer : ");
            input = Console.ReadLine();
            isValid = int.TryParse(input, out number);
            if (!isValid)
                Console.WriteLine("\n Not an integer, please try again\n");
            else
                Console.WriteLine("\n {0}\n", NumberToText(number, useAnd, useArab));
        }
        while (!(isValid && number == 0));

        Console.WriteLine("\nProgram ended");
    }

    public static string NumberToText(int number, bool useAnd, bool useArab)
    {
        if (number == 0) return "Zero";

        string and = useAnd ? "and " : ""; // deals with using 'and' separator

        if (number == -2147483648) return "Minus Two Hundred " + and + "Fourteen Crore Seventy Four Lakh Eighty Three Thousand Six Hundred " + and +"Forty Eight";

        int[] num = new int[4];
        int first = 0;
        int u, h, t;
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        if (number < 0)
        {
            sb.Append("Minus ");
            number = -number;
        }
        string[] words0 = {"" ,"One ", "Two ", "Three ", "Four ", "Five " ,"Six ", "Seven ", "Eight ", "Nine "};
        string[] words1 = {"Ten ", "Eleven ", "Twelve ", "Thirteen ", "Fourteen ", "Fifteen ", "Sixteen ", "Seventeen ", "Eighteen ", "Nineteen "};
        string[] words2 = {"Twenty ", "Thirty ", "Forty ", "Fifty ", "Sixty ", "Seventy ","Eighty ", "Ninety "};
        string[] words3 = { "Thousand ", "Lakh ", "Crore " };
        num[0] = number % 1000; // units
        num[1] = number / 1000;
        num[2] = number / 100000;
        num[1] = num[1] - 100 * num[2]; // thousands
        num[3] = number / 10000000; // crores
        num[2] = num[2] - 100 * num[3]; // lakhs
        for (int i = 3; i > 0; i--)
        {
            if (num[i] != 0)
            {
                first = i;
                break;
            }
        }

        for (int i = first; i >= 0; i--)
        {
            if (num[i] == 0) continue;

            u = num[i] % 10; // ones
            t = num[i] / 10;
            h = num[i] / 100; // hundreds
            t = t - 10 * h;
// tens

            if (h > 0) sb.Append(words0[h] + "Hundred ");
            if (u > 0 || t > 0)
            {
                if (h > 0 || i < first) sb.Append(and);

                if (t == 0)
                    sb.Append(words0[u]);
                else if (t == 1)
                    sb.Append(words1[u]);
                else
                    sb.Append(words2[t - 2] + words0[u]);
            }
            if (i != 0) sb.Append(words3[i - 1]);
        }

        string temp = sb.ToString().TrimEnd();

        if (useArab && Math.Abs(number) >= 1000000000)
        {
            int index = temp.IndexOf("Hundred Crore");
            if (index > -1) return temp.Substring(0, index) + "Arab" + temp.Substring(index + 13);
            index = temp.IndexOf("Hundred");            return temp.Substring(0, index) + "Arab" + temp.Substring(index + 7);
        }
        return temp;

    }
}

Conclusion

As in the case of the previous program, it would not be difficult to extend this program to deal with larger integers or decimal numbers for anyone who needs this functionality.
 

COMMENT USING

Trending up