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