summaryrefslogtreecommitdiff
path: root/ipl/packs/loadfuncpp/examples/numbernamer.icn
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2013-01-28 19:02:21 +0000
committerIgor Pashev <pashev.igor@gmail.com>2013-01-28 19:02:21 +0000
commitf627f77f23d1497c9e1f4269b5c8812d12b42f18 (patch)
tree708772d83a8355e25155cf233d5a9e38f8ad4d96 /ipl/packs/loadfuncpp/examples/numbernamer.icn
parent6ab0c0f5bf14ed9c15370407b9ee7e0b4b089ae1 (diff)
downloadicon-upstream.tar.gz
Imported Upstream version 9.5.0upstream/9.5.0upstream
Diffstat (limited to 'ipl/packs/loadfuncpp/examples/numbernamer.icn')
-rw-r--r--ipl/packs/loadfuncpp/examples/numbernamer.icn61
1 files changed, 61 insertions, 0 deletions
diff --git a/ipl/packs/loadfuncpp/examples/numbernamer.icn b/ipl/packs/loadfuncpp/examples/numbernamer.icn
new file mode 100644
index 0000000..1996c8d
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/numbernamer.icn
@@ -0,0 +1,61 @@
+
+procedure main(arg)
+ every write( number(!arg, 0) )
+end
+
+procedure number(n, state)
+ static small, large, units
+ initial {
+ small := ["one", "two", "three", "four", "five", "six", "seven", "eight",
+ "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
+ "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]
+ large := ["ten", "twenty", "thirty", "forty", "fifty", "sixty",
+ "seventy", "eighty", "ninety"]
+ units := ["thousand", "million", "billion", "trillion", "quadrillion",
+ "quintillion", "sextillion", "septillion", "octillion", "nonillion"]
+ }
+ n := integer(n) | fail
+ if 0 = n then return "zero"
+ if 0 > n then return "minus " || number(-n)
+ if 20 > n then return small[n]
+ if 100 > n then {
+ x := n / 10
+ r := n % 10
+ if (0 = r) then {
+ return large[x]
+ } else {
+ return large[x] || "-" || number(r, state)
+ }
+ }
+ if (1000 > n) then {
+ x := n / 100
+ r := n % 100
+ if (0 = r) then {
+ return number(x, 1) || " hundred"
+ } else {
+ if (0 = state) then {
+ return number(x, 1) || " hundred and " || number(r, 1)
+ } else {
+ return number(x, 1) || " hundred " || number(r, 1)
+ }
+ }
+ }
+
+ every i := 1 to *units do {
+ j := (*units - i + 1)
+ k := j * 3
+ m := 10^k
+ x := n / m
+ r := n % m
+ if (0 < x) then {
+ if (0 = r) then {
+ return number(x, 1) || " " || units[j]
+ } else if ( 100 > r) then {
+ return number(x, 1) || " " || units[j] || " and " || number(r, 1)
+ } else {
+ return number(x, 1) || " " || units[j] || ", " || number(r, 0)
+ }
+ }
+ }
+ return "Error NaN: " || n
+end