public static void Main()
Test(2, Currency.NZD, "Two dollars.");
Test(5, Currency.NZD, "Five dollars.");
Test(5.20m, Currency.NZD, "Five dollars and twenty cents.");
Test(10.01m, Currency.NZD, "Ten dollars and one cent.");
Test(8m, Currency.GBP, "Eight pounds.");
static string CurrencyInWords(decimal amount, Currency currency)
var builder = new StringBuilder();
MaybeAddWholeAmountWords(builder, amount);
MaybeAddFactionalAmountWords(builder, amount);
return builder.ToString();
private static void MaybeAddWholeAmountWords(StringBuilder builder, decimal amount) {
builder.Append(((int)amount).ToWords().Pascalize());
builder.Append(" dollars");
private static void MaybeAddFactionalAmountWords(StringBuilder builder, decimal amount) {
var fractionAmount = (int)((amount - (int)amount) * 100m);
builder.Append(fractionAmount.ToWords());
static void Test(decimal amount, Currency currency, string expected)
Console.WriteLine($"Test: {amount}, {currency}, {expected}");
actual = CurrencyInWords(amount, currency);
Console.WriteLine("PASS.\n");
actual = "Exception: " + e.Message;
Console.WriteLine("FAIL:");
Console.WriteLine(" Expected: " + expected);
Console.WriteLine(" Actual : " + actual);
Console.WriteLine($"{pass} / {pass + fail} tests passed.\n");
Console.WriteLine(fail == 0 ? "SUCCESS!" : "FAILURE!");