Divide the number into groups of 3 digits. Each group has a suffix as thousand, million, billion, etc. except the first. Within the group the phrasing is same.
text(n): if n < 0: return "negative " + text(-n) if n > 999,999,999,999: throw if n == 0: return "zero" groups = groupify(n) phrase = text(groups) return phrase // create groups of ints 1-999 groupify(n): list groups = new while n > 0: groups.add(n %1000) n = n /1000 return groups text(groups): tokens = new for i = groups.count() -1, i >= 0, i--: group = groups[i] if group > 0: grouptokens = new grouptokens.add(convert3digits(group)) groupsuffix = group-suffix(i) if groupsuffix != "": grouptokens.add(groupsuffix) groupphrase = grouptokens.join(" ") tokens.add(groupphrase) phrase = tokens.join(", ") return phrase // tests 0 1-9 10-19 20,30,...,90 21,32,...,99 100 101-109 110-119 120,130,...,190 121,132,...,199 convert3digits(n): if n < 0 || n > 999: throw tokens = new digit3 = n /100 if digit3 > 0: tokens.add(ntophrasemap[digit3]) .add("hundred") digit21 = n %100 if digit21 > 0: if ntophrasemap.has(digit21): tokens.add(ntophrasemap[digit21]) else: digit1 = digit21 %10 digit20 = digit21 - digit1 tokens.add(ntophrasemap[digit20]) .add(ntophrasemap[digit1]) phrase = tokens.join(" ") return phrase group-suffix(i): if i == 0: return "" if i == 1: return "thousand" if i == 2: return "million" if i == 3: return "billion" throw "out of range" ntophrasemap = build-ntophrasemap() build-ntophrasemap(): ntophrasemap = { // key -> value 1 -> "one" 2 -> "two" 3 -> "three" 4 -> "four" 5 -> "five" 6 -> "six" 7 -> "seven" 8 -> "eight" 9 -> "nine" 10 -> "ten" 11 -> "eleven" 12 -> "twelve" 13 -> "thirteen" 14 -> "fourteen" 15 -> "fifteen" 16 -> "sixteen" 17 -> "seventeen" 18 -> "eighteen" 19 -> "nineteen" 20 -> "twenty" 30 -> "thirty" 40 -> "fourty" 50 -> "fifty" 60 -> "sixty" 70 -> "seventy" 80 -> "eighty" 90 -> "ninety" } return ntophrasemap[Hat tip to ctci]
No comments:
Post a Comment