diff options
author | Hugo Hörnquist <hugo@lysator.liu.se> | 2023-11-06 00:40:42 +0100 |
---|---|---|
committer | Hugo Hörnquist <hugo@lysator.liu.se> | 2023-11-16 00:51:19 +0100 |
commit | 29a5d5824ca874b2635f9e812e25198e42b5efc1 (patch) | |
tree | 568510802535956085a5ea99c3498780be9dae8d /module/text | |
parent | Fix swedish ordinals. (diff) | |
download | calp-29a5d5824ca874b2635f9e812e25198e42b5efc1.tar.gz calp-29a5d5824ca874b2635f9e812e25198e42b5efc1.tar.xz |
Add procedures for printing big numbers.
Diffstat (limited to 'module/text')
-rw-r--r-- | module/text/big-numbers.scm | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/module/text/big-numbers.scm b/module/text/big-numbers.scm new file mode 100644 index 00000000..325cc2f3 --- /dev/null +++ b/module/text/big-numbers.scm @@ -0,0 +1,31 @@ +(define-module (text big-numbers) + :use-module ((hnh util) :select (->>)) + :use-module (hnh util type) + :export (number->exponential-form + power-of-10? + subscript supscript)) + +(define (integer-string-ref str n) + (typecheck str string?) + (typecheck n (and exact? integer?)) + (->> n + number->string + string->list + (map char->integer) + (map (lambda (x) (- x (char->integer #\0)))) + (map (lambda (i) (string-ref str i))) + list->string)) + +(define (subscript n) + (integer-string-ref "₀₁₂₃₄₅₆₇₈₉" n)) + +(define (supscript n) + (integer-string-ref "⁰¹²³⁴⁵⁶⁷⁸⁹" n)) + +;;; Is the number a power of 10? +(define (power-of-10? x) + (integer? (log10 (exact->inexact x)))) + +(define (number->exponential-form n) + (typecheck n (and exact? integer? power-of-10?)) + (string-append "10" (supscript (inexact->exact (round (log10 n)))))) |