public string ConvertCurrencyToWords(decimal value) { if (value == 0) { return(GetZeroDollars()); } var words = new List <string>(); var wholeNumber = decimal.Truncate(value); var fraction = (value - wholeNumber) * 100; if (wholeNumber > 0) { var power = MaxPower; while (power >= 0) { var partNumber = decimal.ToInt32(wholeNumber % (int)Math.Pow(10, power + 3) / (int)Math.Pow(10, power)); if (partNumber > 0) { words.Add(ConvertNumberToWords(partNumber)); words.Add(ConverterHelper.GetPowerName(power)); } power -= 3; } var currency = wholeNumber == 1 ? ConverterHelper.CurrencyName : ConverterHelper.CurrencyNamePlural; words.Add(currency); } if (fraction > 0) { if (words.Count > 0) { words.Add("and"); } words.Add(ConvertNumberToWords((int)fraction)); var currencyCent = fraction == 1 ? ConverterHelper.CurrencyCentName : ConverterHelper.CurrencyCentPlural; words.Add(currencyCent); } var result = string.Join(" ", words.Where(w => !string.IsNullOrEmpty(w))); return(result); }