2026-04-01 10:44:46 +02:00
|
|
|
#import "@preview/oxifmt:1.0.0": strfmt
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-04-03 18:57:39 +02:00
|
|
|
#let format-eur(cents) = {
|
|
|
|
|
// 1. Gestione del segno
|
|
|
|
|
let is-negative = cents < 0
|
|
|
|
|
let abs-cents = calc.abs(cents)
|
2026-04-01 10:44:46 +02:00
|
|
|
|
2026-04-03 18:57:39 +02:00
|
|
|
// 2. Calcolo parte intera e frazionaria
|
|
|
|
|
// Usiamo calc.round per sicurezza se l'input non fosse un intero puro
|
|
|
|
|
let total-abs = calc.round(abs-cents)
|
|
|
|
|
let whole = calc.trunc(total-abs / 100)
|
|
|
|
|
let frac = calc.rem(total-abs, 100)
|
|
|
|
|
|
|
|
|
|
// 3. Formattazione Migliaia (punti)
|
|
|
|
|
let chars = str(whole).clusters()
|
|
|
|
|
let formatted-whole = ""
|
|
|
|
|
let count = 0
|
|
|
|
|
for c in chars.rev() {
|
|
|
|
|
if count > 0 and calc.rem(count, 3) == 0 {
|
|
|
|
|
formatted-whole = "." + formatted-whole
|
|
|
|
|
}
|
|
|
|
|
formatted-whole = c + formatted-whole
|
|
|
|
|
count += 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 4. Formattazione Centesimi (sempre 2 cifre)
|
|
|
|
|
// Usiamo lo zero-padding per casi come 5 centesimi -> "05"
|
|
|
|
|
let frac-str = if frac < 10 { "0" + str(frac) } else { str(frac) }
|
|
|
|
|
|
|
|
|
|
// 5. Output finale
|
|
|
|
|
let sign = if is-negative { "-" } else { "" }
|
|
|
|
|
|
|
|
|
|
// Ritorna il testo formattato
|
|
|
|
|
[#sign #formatted-whole,#frac-str €]
|
2026-04-01 10:44:46 +02:00
|
|
|
}
|