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);
        }