public int Thousands { get; set; }
public int Hundreds { get; set; }
public int Tens { get; set; }
public int Cents { get; set; }
public MoneyTypes(int thousands, int hundreds, int tens, int cents)
public class WordConversionService
public string Execute(decimal number)
var data = MoneyConversion(number);
return ConvertToWord(data);
private MoneyTypes MoneyConversion(decimal number)
var dollars = decimal.ToInt32(number);
var split = number.ToString()?.Split(".");
cents = int.Parse(split[1]);
var thousands = (dollars % 10000) / 1000;
var hundreds = (dollars % 1000) / 100;
var tens = (dollars % 100);
return new MoneyTypes(thousands, hundreds, tens, cents);
private string ConvertToWord(MoneyTypes moneyTypes)
var finalString = ConvertThousands(moneyTypes.Thousands);
if (moneyTypes.Hundreds > 0 )
var hundreds = ConvertHundreds(moneyTypes.Hundreds);
var tens = ConvertTens(moneyTypes.Tens);
finalString += (finalString == string.Empty) ? tens : " and " + tens;
finalString += Dollars(moneyTypes);
if (moneyTypes.Cents > 0 )
var cents = ConvertTens(moneyTypes.Cents);
finalString += finalString == string.Empty ? cents : " and " + cents; ;
finalString += Cents(moneyTypes.Cents);
private string ConvertSingleNumber(int number)
private string ConvertDoubleNumber(int tens, int ones)
var oneWords = ConvertSingleNumber(ones);
return ConvertSingleNumber(ones);
oneWords = " " + oneWords;
return ConvertDoubleStartingWithOnes(ones);
return "twenty" + oneWords;
return "thirty" + oneWords;
return "fourty" + oneWords;
return "fifty" + oneWords;
return "sixty" + oneWords;
return "seventy" + oneWords;
return "eighty" + oneWords;
return "ninety" + oneWords;
private string ConvertDoubleStartingWithOnes(int ones)
private string ConvertThousands(int number)
return number > 0 ? (ConvertSingleNumber(number) + " thousand") : string.Empty;
private string ConvertHundreds(int number)
return number > 0 ? (ConvertSingleNumber(number) + " hundred") : string.Empty;
private string ConvertTens(int number)
var tens = (number % 100) / 10;
return ConvertDoubleNumber(tens, ones);
private string Dollars(MoneyTypes moneyType)
var totalAmount = moneyType.Thousands + moneyType.Hundreds + moneyType.Tens;
if (totalAmount == 1 && moneyType.Tens == 1)
private string Cents(int cents)
static string DollarsToWords(decimal value)
if (value == decimal.Zero)
return "Error: Value too high, enter a value below 1000.";
var wordConversionService = new WordConversionService();
var words = wordConversionService.Execute(value);
public static void Main()
Test(0.12m, "twelve cents");
Test(10.55m, "ten dollars and fifty five cents");
Test(120, "one hundred and twenty dollars");
Test(99, "ninety nine dollars");
Test(91, "ninety one dollars");
Test(0.99m, "ninety nine cents");
Test(1000, "one thousand dollars");
Test(901, "nine hundred and one dollars");
Test(10000, "Error: Value too high, enter a value below 1000.");
static void Test(decimal number, string expected)
var actual = DollarsToWords(number);
Console.WriteLine($"{number}: PASS");
Console.WriteLine($"{number}: FAIL");
Console.WriteLine($" Expected: {expected}");
Console.WriteLine($" Actual: {actual}");