aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2023-11-06 00:41:45 +0100
committerHugo Hörnquist <hugo@lysator.liu.se>2023-11-16 00:51:19 +0100
commitf46b0ef734fe4d972cb6c8d4e370fa61236e7a44 (patch)
tree47faa6ea2396637610b31d27dee48c86abf522ef
parentAdd procedures for printing big numbers. (diff)
downloadcalp-f46b0ef734fe4d972cb6c8d4e370fa61236e7a44.tar.gz
calp-f46b0ef734fe4d972cb6c8d4e370fa61236e7a44.tar.xz
Cleanup swedish word numbers.
-rw-r--r--module/text/numbers/sv.scm47
-rw-r--r--tests/unit/text/numbers-sv-short.scm16
-rw-r--r--tests/unit/text/numbers-sv.scm.disabled5
3 files changed, 33 insertions, 35 deletions
diff --git a/module/text/numbers/sv.scm b/module/text/numbers/sv.scm
index 5764abbc..b4498a86 100644
--- a/module/text/numbers/sv.scm
+++ b/module/text/numbers/sv.scm
@@ -1,12 +1,16 @@
(define-module (text numbers sv)
- :use-module ((srfi srfi-1) :select (every))
+ :use-module ((srfi srfi-1) :select (every last))
:use-module (srfi srfi-71)
+ :use-module ((text util) :select (words))
+ :use-module (text big-numbers)
:use-module (hnh util)
:use-module (hnh util type)
:export (number->string-cardinal
number->string-ordinal
each-string))
+(define maxnum (1- #e1e66))
+
(define (exp-name x)
(case x
((0) "")
@@ -90,7 +94,7 @@
(if (and have-larger (= e3 1)) " " "")
(exp-name e3)))]
- [(< n (1- #e1e66))
+ [(< n maxnum)
(let ((head tail (floor/ n 1000)))
(string-append
(loop head (+ e3 1) #f)
@@ -102,11 +106,10 @@
(else (string-append
" " (loop tail e3 #t))))))]
-
[else
;; I give up, don't have larger numbers that that!
(string-append "det stora talet "
- (number->string n))]))]))
+ (number->exponential-form n))]))]))
(define* (number->string-ordinal
n key: a-form? allow-other-keys:)
@@ -117,7 +120,7 @@
((0) (cond [(>= -3 n) (string-append (number->string-ordinal (- n) a-form?: a-form?) " sista" )]
[(= -2 n) "näst sista"]
[(= -1 n) "sista"]
- [(= 0 n) "nollte"] ;
+ [(= 0 n) "nollte"]
[(= 1 n) (string-append "först" a-string)]
[(= 2 n) (string-append "andr" a-string)]
[(= 3 n) "tredje"]
@@ -128,22 +131,16 @@
[(= 8 n) "åttonde"]
[(= 9 n) "nionde"]
[(= 10 n) "tionde"]
+
[(= 11 n) "elfte"]
[(= 12 n) "tolfte"]
- [(= 13 n) "trettonde"]
- [(= 14 n) "fjortonde"]
- [(= 15 n) "femtonde"]
- [(= 16 n) "sextonde"]
- [(= 17 n) "sjuttonde"]
- [(= 18 n) "artonde"]
- [(= 19 n) "nittonde"]
- [(= 20 n) "tjugonde"]
- [(<= 20 n 29) (string-append "tjugo"
- (number->string-ordinal
- (- n 20)
- a-form?: a-form?))]
-
- [(<= 30 n 99)
+
+ [(<= 13 n 19)
+ (string-append
+ (number->string-cardinal n)
+ "de")]
+
+ [(<= 20 n 99)
(let ((big small (floor/ n 10)))
(string-append
(number->string-cardinal (* 10 big))
@@ -152,8 +149,6 @@
(number->string-ordinal
small a-form?: a-form?))))]
- [(= n 100) "etthundrade"]
-
[else
(let ((big small (floor/ n 100)))
(string-append (number->string-cardinal (* big 100))
@@ -165,13 +160,11 @@
((1) (string-append (number->string-cardinal n) "tusende"))
(else (string-append
(if (= n 1) "" (string-append (number->string-cardinal n) " "))
- (case e
- ((2) "miljonte")
- ((3) "miljarde")
- ((4) "biljonte"))))))
+ (last (words (number->string-cardinal (expt 10 (* 3 e)))))
+ (if (even? e) "te" "e")))))
- (if (>= n #e1e15)
- (string-append (number->string n) ":e")
+ (if (> n maxnum)
+ (string-append (number->exponential-form n) ":e")
(let loop ((n n) (e 0))
(if (> 1000 n)
(main-part n e)
diff --git a/tests/unit/text/numbers-sv-short.scm b/tests/unit/text/numbers-sv-short.scm
index 266553ad..a5b1ff1e 100644
--- a/tests/unit/text/numbers-sv-short.scm
+++ b/tests/unit/text/numbers-sv-short.scm
@@ -98,9 +98,8 @@
(test-equal "en noniljard" (number->string-cardinal #e1e57 'sv))
(test-equal "en deciljon" (number->string-cardinal #e1e60 'sv))
(test-equal "en deciljard" (number->string-cardinal #e1e63 'sv))
- (test-equal "det stora talet 1000000000000000000000000000000000000000000000000000000000000000000"
- (number->string-cardinal #e1e66 'sv))
- )
+ (test-equal "det stora talet 10⁶⁶"
+ (number->string-cardinal #e1e66 'sv)))
(test-group "Ordinal numbers"
(test-equal "nollte" (number->string-ordinal 0 'sv a-form?: #t))
@@ -195,10 +194,13 @@
(test-equal "niohundraåttiosju miljoner sexhundrafemtiofyra tusen trehundratjugoförsta"
(number->string-ordinal 987654321 'sv a-form?: #t))
(test-equal "miljarde" (number->string-ordinal 1000000000 'sv a-form?: #t))
- (test-equal "biljonte" (number->string-ordinal 1000000000000 'sv a-form?: #t)))
-(test-equal "niohundranittionio biljoner niohundranittionio miljarder niohundranittionio miljoner niohundranittionio tusen niohundranittionionde"
- (number->string-ordinal (1- #e1e15) 'sv))
-(test-equal "1000000000000000:e" (number->string-ordinal #e1e15 'sv))
+ (test-equal "biljonte" (number->string-ordinal 1000000000000 'sv a-form?: #t))
+ (test-equal "niohundranittionio biljoner niohundranittionio miljarder niohundranittionio miljoner niohundranittionio tusen niohundranittionionde"
+ (number->string-ordinal (1- #e1e15) 'sv))
+ (test-equal "biljarde" (number->string-ordinal #e1e15 'sv))
+ (test-equal "10⁶⁶:e"
+ (number->string-ordinal #e1e66 'sv))
+ )
'((text numbers)
(text numbers sv))
diff --git a/tests/unit/text/numbers-sv.scm.disabled b/tests/unit/text/numbers-sv.scm.disabled
index 91fbe63b..20c45eec 100644
--- a/tests/unit/text/numbers-sv.scm.disabled
+++ b/tests/unit/text/numbers-sv.scm.disabled
@@ -2464,7 +2464,10 @@
(test-equal "etthundra miljonte" (number->string-ordinal 100000000 'sv a-form?: #t))
(test-equal "niohundraåttiosju miljoner sexhundrafemtiofyra tusen trehundratjugoförsta" (number->string-ordinal 987654321 'sv a-form?: #t))
(test-equal "miljarde" (number->string-ordinal 1000000000 'sv a-form?: #t))
- (test-equal "biljonte" (number->string-ordinal 1000000000000 'sv a-form?: #t)))
+ (test-equal "biljonte" (number->string-ordinal 1000000000000 'sv a-form?: #t))
+ (test-equal "etthundra deciljarde" (number->string-ordinal #e1e65 'sv a-form?: #t))
+ (test-equal "etthundra deciljarde" (number->string-ordinal #e1e66 'sv a-form?: #t))
+ )