# `gno.land/p/moul/x/daily/humanize/v0` **Human-facing number formatting** — `Bytes`, `Comma`, `Ordinal`, `Plural`, `Blocks`, `Truncate`. ```go import "gno.land/p/moul/x/daily/humanize/v0" humanize.Bytes(1536) // "1.5 KiB" humanize.Comma(1234567) // "1,234,567" humanize.Ordinal(12) // "12th" — not "12nd" humanize.Plural(2, "mouse", "mice") // "2 mice" humanize.Blocks(1234) // "~1,200 blocks" humanize.Truncate("ééé", 2) // "é…" ``` **Integer-only, on purpose.** No floats anywhere: a rendered value that differed between nodes would be a consensus bug, so the single decimal place in `Bytes` comes from scaling by 10 and taking a remainder. **Durations are in blocks, never seconds.** There is no wall clock on chain, so "about 2 hours" is a lie dressed as precision. `Blocks` says `~1,200 blocks` and lets the caller decide what that means on their chain — and rounds deliberately, because false precision is worse than none. `Ordinal` handles the teens (`11th`/`12th`/`13th`, not `11st`/`12nd`/`13rd`) — the case naive implementations get wrong. `Truncate` counts **runes**, so multi-byte text is never sliced mid-character. **Live demo:** [`r/moul/x/daily/humanizedemo`](https://github.com/moul/gno-contracts/tree/main/r/moul/x/daily/humanizedemo/v0) · render it at [`/r/moul/x/daily/humanizedemo/v0`](https://gno.land/r/moul/x/daily/humanizedemo/v0). --- Part of **[moul/gno-contracts](https://github.com/moul/gno-contracts)** — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage. > 🧪 **Highly experimental — potentially vibe-coded.** Not audited; may break, change, or be removed at any time. Do not use with anything of value. Full disclaimer: [DISCLAIMER](https://github.com/moul/gno-contracts/blob/main/DISCLAIMER.md).