REBOL [ title: "Number Verbalizer" date: 13-Mar-2010 file: %number-verbalizer.r author: Nick Antonaccio purpose: { Converts number values to their spoken English equivalent. (i.e., 23482194 = "Twenty Three million, Four Hundred Eighty Two thousand, One Hundred Ninety Four"). This code was created for a check writing application, but is perhaps useful elsewhere. The algorithm was partially derived from the article at http://www.blackwasp.co.uk/NumberToWords.aspx (C# code). Taken from the tutorial at http://re-bol.com. } ] verbalize: func [a-number] [ if error? try [a-number: to-decimal a-number] [ return "** Error ** Input must be a decimal value" ] if a-number = 0 [return "Zero"] the-original-number: round/down a-number pennies: a-number - the-original-number the-number: the-original-number if a-number < 1 [ return join to-integer ((round/to pennies .01) * 100) "/100" ] small-numbers: [ "One" "Two" "Three" "Four" "Five" "Six" "Seven" "Eight" "Nine" "Ten" "Eleven" "Twelve" "Thirteen" "Fourteen" "Fifteen" "Sixteen" "Seventeen" "Eighteen" "Nineteen" ] tens-block: [ { } "Twenty" "Thirty" "Forty" "Fifty" "Sixty" "Seventy" "Eighty" "Ninety" ] big-numbers-block: ["Thousand" "Million" "Billion"] digit-groups: copy [] for i 0 4 1 [ append digit-groups (round/floor (mod the-number 1000)) the-number: the-number / 1000 ] spoken: copy "" for i 5 1 -1 [ flag: false hundreds: (pick digit-groups i) / 100 tens-units: mod (pick digit-groups i) 100 if hundreds <> 0 [ if none <> hundreds-portion: (pick small-numbers hundreds) [ append spoken join hundreds-portion " Hundred " ] flag: true ] tens: tens-units / 10 units: mod tens-units 10 if tens >= 2 [ append spoken (pick tens-block tens) if units <> 0 [ if none <> last-portion: (pick small-numbers units) [ append spoken rejoin [" " last-portion " "] ] flag: true ] ] if tens-units <> 0 [ if none <> tens-portion: (pick small-numbers tens-units) [ append spoken join tens-portion " " ] flag: true ] if flag = true [ commas: copy {} case [ ((i = 4) and (the-original-number > 999999999)) [ commas: {billion, } ] ((i = 3) and (the-original-number > 999999)) [ commas: {million, } ] ((i = 2) and (the-original-number > 999)) [ commas: {thousand, } ] ] append spoken commas ] ] append spoken rejoin [ "and " to-integer ((round/to pennies .01) * 100) "/100" ] return spoken ] ; HERE'S AN EXAMPLE: print verbalize ask "Enter a number to verbalize: " halt