using System.Collections.Generic;
namespace QualityWeek_CodingContest.Main
static int[] n11 = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
static string[] n12 = new string[] { "zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine" };
static int[] n21 = new int[] { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90 };
static string[] n22 = new string[] { "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty",
"Thirty", "Fourty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" };
static int[] n31 = new int[] {1,2,3,4,5,6};
static string[] n32 = new string[] {"Thousand", "Thousand", "Lakh", "Lakh", "Crore", "Crore"};
static string[] n42 = new string[] {"Thousand", "Million", "Billion"};
static StringBuilder words = new StringBuilder();
const string LAKH = "Lakh";
const string THOUSAND = "Thousand";
const string HUNDRED = "Hundred";
const string ONLY = "Only";
public static void Main(string[] args)
words = new StringBuilder();
Console.Write(Environment.NewLine);
Console.WriteLine("Please enter number...");
Console.Write(Environment.NewLine);
Console.WriteLine("Please enter 1 for Indian format or 2 for Western...");
format = Int32.Parse(Console.ReadLine());
decNum = Math.Round(Convert.ToDecimal(s), 2);
if(decNum == 0 || decNum == Convert.ToDecimal(0.00))
words.Append("Zero Only");
Console.Write(Environment.NewLine);
Console.WriteLine(Convert.ToString(words));
int[] intNum = NumbersIn(Convert.ToInt64(decNum.ToString().Split('.')[0]));
Console.Write(Environment.NewLine);
Console.WriteLine("Number to Words possible up to crores not beyond that.");
NumberInIndianWords(intNum);
else if(intNum.Count() == 3)
else if(intNum.Count() == 1 || intNum.Count() == 2)
if(decNum.ToString().Split('.').Count() > 1)
string decPart = decNum.ToString().Split('.')[1];
intNum = NumbersIn(Convert.ToInt64(Convert.ToDouble(decPart).ToString()));
string decWord = UnitInWords(intNum, false);
words.AppendFormat(" And{0} Paise", decWord);
int cnt = intNum.Count();
int[][] westArray = new int[arraySize][];
int[] partArray = new int[3];
for(int m = 2; m >= 0; m--)
partArray[m] = intNum[cnt];
westArray[arrayCnt] = partArray;
for(cnt = 0; cnt < westArray.Count() ; cnt++)
string hundredInWord = HundredInWords(westArray[cnt], false);
if(cnt > 0 && !string.IsNullOrWhiteSpace(hundredInWord))
words.Insert(0, string.Format("{0} {1}",hundredInWord, n42[cnt-1]));
else if(!string.IsNullOrWhiteSpace(hundredInWord))
words.Insert(0, string.Format("{0}",hundredInWord));
words.Append(" Dollars");
if(decNum.ToString().Split('.').Count() > 1)
string decPart = decNum.ToString().Split('.')[1];
intNum = NumbersIn(Convert.ToInt64(Convert.ToDouble(decPart).ToString()));
string decWord = UnitInWords(intNum, false);
words.AppendFormat(" And{0} Cent", decWord);
words.AppendFormat(" {0}", ONLY);
Console.Write(Environment.NewLine);
Console.WriteLine(Convert.ToString(words));
private static void NumberInIndianWords(int[] intNum)
string digit = string.Empty;
while(intNum.Count() > 3)
index = n31.ToList().IndexOf(intNum.Count()-3);
if((intNum.Count() % 2) == 0)
if (intNum[0] > 0 && intNum[0] < 10)
var i1 = n11.ToList().IndexOf(intNum[0]);
words.AppendFormat(" {0} {1}",n12[i1], digit);
intNum = intNum.Skip(1).ToArray();
else if((intNum.Count() % 2) != 0)
if(intNum[0] + intNum[1] == 0)
intNum = intNum.Skip(2).ToArray();
index = n21.ToList().IndexOf(int.Parse(intNum[0].ToString() + intNum[1].ToString()));
words.AppendFormat(" {0} {1}",n22[index], digit);
index = n21.ToList().IndexOf(int.Parse(intNum[0].ToString()+ "0"));
words.AppendFormat(" {0}",n22[index]);
if (intNum[1] > -1 && intNum[1] < 10)
var i1 = n11.ToList().IndexOf(intNum[1]);
words.AppendFormat(" {0} {1}",n12[i1], digit);
intNum = intNum.Skip(2).ToArray();
private static string HundredInWords(int[] intNum, bool IsAppend = true)
StringBuilder hundredWord = new StringBuilder();
if (intNum[0] > 0 && intNum[0] < 10)
var i1 = n11.ToList().IndexOf(intNum[0]);
intNum = intNum.Skip(1).ToArray();
words.AppendFormat(" {0} {1} And",n12[i1], HUNDRED);
words.AppendFormat(" {0} {1}",n12[i1], HUNDRED);
hundredWord.AppendFormat(" {0} {1} And",n12[i1], HUNDRED);
string unitWord = UnitInWords(intNum, false);
hundredWord.AppendFormat(" {0}", unitWord);
hundredWord.AppendFormat(" {0} {1}",n12[i1], HUNDRED);
else if(intNum.Sum() != 0)
intNum = intNum.Skip(1).ToArray();
string unitWord = UnitInWords(intNum, false);
hundredWord.AppendFormat(" And{0}", unitWord);
return hundredWord.ToString();
private static string UnitInWords(int[] intNum, bool IsAppend = true)
StringBuilder unitWord = new StringBuilder();
if (intNum[0] > -1 && intNum[0] < 10)
var i1 = n11.ToList().IndexOf(intNum[0]);
words.AppendFormat(" {0}",n12[i1]);
unitWord.AppendFormat(" {0}",n12[i1]);
else if(intNum.Count() == 2)
int index = n21.ToList().IndexOf(int.Parse(intNum[0].ToString() + intNum[1].ToString()));
words.AppendFormat(" {0}", n22[index]);
unitWord.AppendFormat(" {0}", n22[index]);
index = n21.ToList().IndexOf(int.Parse(intNum[0].ToString()+ "0"));
words.AppendFormat(" {0}",n22[index]);
unitWord.AppendFormat(" {0}",n22[index]);
if (intNum[1] > 0 && intNum[1] < 10)
var i1 = n11.ToList().IndexOf(intNum[1]);
words.AppendFormat(" {0}",n12[i1]);
unitWord.AppendFormat(" {0}",n12[i1]);
return unitWord.ToString();
private static int[] NumbersIn(long Num)
var numbers = new Stack<int>();
for(; Num > 0; Num /= 10)
numbers.Push((int)Num % 10);
return numbers.ToArray();