public string Convert(decimal input)
        {
            int  cents   = GetCents(input);
            long dollars = (long)input;
            List <TripletBlock> hundredblocks = new List <TripletBlock>();
            int blockindex = 1;

            while (TrySplitAtPowerOf10(dollars, 3, out long left, out int right))
            {
                hundredblocks.Add(new TripletBlock(blockindex, right));
                dollars = left;
                blockindex++;
            }
            hundredblocks.Add(new TripletBlock(blockindex, (int)dollars));
            TripletBlock centsBlock = new TripletBlock(0, cents);

            return(CombineBlocks(hundredblocks, centsBlock, dollars != 1, cents > 0, cents != 1));
        }
        private string CombineBlocks(List <TripletBlock> blocks, TripletBlock cents, bool usePluralForDollars, bool displayCents, bool usePluralForCents)
        {
            StringBuilder builder       = new StringBuilder();
            var           blocksOrdered = blocks.OrderBy(x => - x.Index);
            List <string> stringvalues  = new List <string>();

            foreach (var block in blocksOrdered)
            {
                stringvalues.AddRange(BlockToStrings(block.Value, includeZero: blocks.Count == 1));
                if (powersOfTen.ContainsKey(block.Index))
                {
                    stringvalues.Add(powersOfTen[block.Index]);
                }
            }

            if (usePluralForDollars)
            {
                stringvalues.Add("dollars");
            }
            else
            {
                stringvalues.Add("dollar");
            }

            if (displayCents)
            {
                stringvalues.Add("and");
                stringvalues.AddRange(BlockToStrings(cents.Value, includeZero: false));

                if (usePluralForCents)
                {
                    stringvalues.Add("cents");
                }
                else
                {
                    stringvalues.Add("cent");
                }
            }

            return(string.Join(" ", stringvalues.ToArray()));
        }