public static void Main(string[] args)
var fromIntegerToWordsParser = new FromIntegerToWordsParser();
var firstIntegerInWords = fromIntegerToWordsParser.GetIntegerInWords(-9223372036854775807L);
Console.WriteLine("Integer in words: {0}\n", firstIntegerInWords);
var fromWordsToIntegerParser = new FromWordsToIntegerParser();
var firstInteger = fromWordsToIntegerParser.GetInteger(firstIntegerInWords);
Console.WriteLine("Integer: {0}", firstInteger);
private class FromWordsToIntegerParser
private long _resultInteger;
private int _currentAmountOfHundreds;
private int _currentAmountOfTens;
private bool _integerIsNegative;
private readonly StringBuilder _stringBuilder = new StringBuilder();
public long GetInteger(string integerInWords)
var arrayOfWords = integerInWords.Split(' ');
if (integerInWords.Length == 0 || arrayOfWords.Length == 0)
for (var i = 0; i < arrayOfWords.Length; i++)
_stringBuilder.Append("1");
_stringBuilder.Append("2");
_stringBuilder.Append("3");
_stringBuilder.Append("4");
_stringBuilder.Append("5");
_stringBuilder.Append("6");
_stringBuilder.Append("7");
_stringBuilder.Append("8");
_stringBuilder.Append("9");
_stringBuilder.Append("10");
_stringBuilder.Append("11");
_stringBuilder.Append("12");
_stringBuilder.Append("13");
_stringBuilder.Append("14");
_stringBuilder.Append("15");
_stringBuilder.Append("16");
_stringBuilder.Append("17");
_stringBuilder.Append("18");
_stringBuilder.Append("19");
_currentAmountOfTens = 2;
_currentAmountOfTens = 3;
_currentAmountOfTens = 4;
_currentAmountOfTens = 5;
_currentAmountOfTens = 6;
_currentAmountOfTens = 7;
_currentAmountOfTens = 8;
_currentAmountOfTens = 9;
_currentAmountOfHundreds = Convert.ToInt16(_stringBuilder.ToString());
AddToResult(1000000000L);
AddToResult(1000000000000L);
AddToResult(1000000000000000L);
AddToResult(1000000000000000000L);
_integerIsNegative = true;
throw new Exception("String contains unidentified word.");
private void AddToResult(long multiplier)
if (_currentAmountOfHundreds != 0)
_resultInteger += _currentAmountOfHundreds * 100 * multiplier;
_currentAmountOfHundreds = 0;
if (_currentAmountOfTens != 0)
_resultInteger += _currentAmountOfTens * 10 * multiplier;
_currentAmountOfTens = 0;
if (_stringBuilder.Length != 0)
_resultInteger += Convert.ToInt16(_stringBuilder.ToString()) * multiplier;
private class FromIntegerToWordsParser
public string GetIntegerInWords(long number)
var stringBuilder = new StringBuilder();
stringBuilder.Append("minus");
var quintillions = (short)(number / 1000000000000000000L);
var quintillionsInWords = GetNumberUnderThousandInWords(quintillions);
AddSpaceIfIsNeeded(stringBuilder, quintillions > 0);
stringBuilder.Append(quintillionsInWords);
stringBuilder.Append(quintillionsInWords != "" ? " quintillion" : "");
number = number - quintillions * 1000000000000000000L;
var quadrillions = (short)(number / 1000000000000000L);
var quadrillionsInWords = GetNumberUnderThousandInWords(quadrillions);
AddSpaceIfIsNeeded(stringBuilder, quadrillions > 0);
stringBuilder.Append(quadrillionsInWords);
stringBuilder.Append(quadrillionsInWords != "" ? " quadrillion" : "");
number = number - quadrillions * 1000000000000000L;
var trillions = (short)(number / 1000000000000L);
var trillionsInWords = GetNumberUnderThousandInWords(trillions);
AddSpaceIfIsNeeded(stringBuilder, trillions > 0);
stringBuilder.Append(trillionsInWords);
stringBuilder.Append(trillionsInWords != "" ? " trillion" : "");
number = number - trillions * 1000000000000L;
var billions = (short)(number / 1000000000L);
var billionsInWords = GetNumberUnderThousandInWords(billions);
AddSpaceIfIsNeeded(stringBuilder, billions > 0);
stringBuilder.Append(billionsInWords);
stringBuilder.Append(billionsInWords != "" ? " billion" : "");
number = number - billions * 1000000000L;
var millions = (short)(number / 1000000L);
var millionsInWords = GetNumberUnderThousandInWords(millions);
AddSpaceIfIsNeeded(stringBuilder, millions > 0);
stringBuilder.Append(millionsInWords);
stringBuilder.Append(millionsInWords != "" ? " million" : "");
number = number - millions * 1000000L;
var thousands = (short)(number / 1000L);
var thousandsInWords = GetNumberUnderThousandInWords(thousands);
AddSpaceIfIsNeeded(stringBuilder, thousands > 0);
stringBuilder.Append(thousandsInWords);
stringBuilder.Append(thousandsInWords != "" ? " thousand" : "");
number = number - thousands * 1000L;
var numberUnderThousandInWords = GetNumberUnderThousandInWords((short)number);
AddSpaceIfIsNeeded(stringBuilder, number > 0);
stringBuilder.Append(numberUnderThousandInWords);
return stringBuilder.ToString();
private string GetNumberUnderThousandInWords(short number)
if (number < 0 || number > 999)
throw new Exception("Inappropriate number.");
var stringBuilder = new StringBuilder();
var hundreds = (byte)(number / 100);
stringBuilder.Append(GetDigitInWords(hundreds));
stringBuilder.Append(" hundred");
number = (short)(number - (short)(hundreds * 100));
var tens = (byte)(number / 10);
AddSpaceIfIsNeeded(stringBuilder, true);
stringBuilder.Append(tens == 1
? GetNumberFromTenToNineteenInWords((byte)number)
: GetNumberOfTensInWords(tens));
if (tens == 1) return stringBuilder.ToString();
number = (short)(number - (short)(tens * 10));
AddSpaceIfIsNeeded(stringBuilder, true);
stringBuilder.Append(GetDigitInWords((byte)number));
return stringBuilder.ToString();
private string GetDigitInWords(byte number)
if (number < 1 || number > 9)
throw new Exception("Inappropriate number.");
private string GetNumberFromTenToNineteenInWords(byte number)
if (number < 10 || number > 19)
throw new Exception("Inappropriate number.");
private string GetNumberOfTensInWords(byte number)
if (number < 2 || number > 9)
throw new Exception("Inappropriate number.");
private void AddSpaceIfIsNeeded(StringBuilder stringBuilder, bool needed)
if (stringBuilder.Length != 0 && needed)
stringBuilder.Append(" ");