format number properly

This commit is contained in:
Jean-Marie Mineau 2025-06-24 12:19:00 +02:00
parent 1dc9e8227e
commit d730d1f4a7
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
15 changed files with 67 additions and 29 deletions

36
lib.typ Normal file
View file

@ -0,0 +1,36 @@
#import "@local/template-thesis-matisse:0.0.1": *
// Format number.
// Following https://www.mit.edu/course/21/21.guide/numbers.htm
#let num(n, decimal: ".", thousands: " ") = {
let n = if type(n) == str {
float(n)
} else {
n
}
assert(type(n) == int or type(n) == float, message: "must be a number")
let parts = str(n).split(".")
let decimal_p = if parts.len() == 2 { parts.at(1) }
let integer_p = parts.at(0)
let integer_p = if integer_p.len() <= 4 {
integer_p
} else {
let nb_cluster = calc.div-euclid(integer_p.len(), 3)
let first_cluster_size = calc.rem-euclid(integer_p.len(), 3)
let clusters = ()
if first_cluster_size != 0 {
clusters.push(integer_p.slice(0, count: first_cluster_size))
}
for i in range(0, nb_cluster) {
clusters.push(integer_p.slice(first_cluster_size + i*3, count: 3))
}
clusters.join(thousands)
}
let formated = integer_p + if decimal_p != none { decimal + decimal_p }
[#formated]
}
#let mypercent(numerator, denominator, digits: 2) = [#num(calc.round((100 * numerator) / denominator, digits: digits))%]