Files
fish-shell/printf
Daniel Rainer 09eae92888 Make printf unicode-aware
Specifically, the width and precision format specifiers are interpreted as
referring to the width of the grapheme clusters rather than the byte count of
the string. Note that grapheme clusters can differ in width.

If a precision is specified for a string, meaning its "maximum number of
characters", we consider this to limit the width displayed.
If there is a grapheme cluster whose width is greater than 1,
it might not be possible to get precisely the desired width.
In such cases, this last grapheme cluster is excluded from the output.

Note that the definitions used here are not consistent with the `string length`
builtin at the moment, but this has already been the case.
2025-05-03 22:53:27 +02:00
..
2025-05-03 22:53:27 +02:00
2025-05-03 22:53:27 +02:00
2025-05-02 22:31:39 +02:00

fish-printf

The printf implementation used in fish-shell, based on musl printf.

crates.io

Licensed under the MIT license.

Usage

Run cargo add fish-printf to add this crate to your Cargo.toml file.

Notes

fish-printf attempts to match the C standard for printf. It supports the following features:

  • Locale-specific formatting (decimal point, thousands separator, etc.)
  • Honors the current rounding mode.
  • Supports the %n modifier for counting characters written.

fish-printf does not support positional arguments, such as printf("%2$d", 1, 2).

Prefixes like l or ll are recognized, but only used for validating the format string. The size of integer values is taken from the argument type.

fish-printf can output to an std::fmt::Write object, or return a string.

For reasons related to fish-shell, fish-printf has a feature "widestring" which uses the widestring crate. This is off by default. If enabled, run cargo add widestring to add the widestring crate.

Examples

use fish_printf::sprintf;

// Create a `String` from a format string.
let s = sprintf!("%0.5g", 123456.0) // 1.2346e+05

// Append to an existing string.
let mut s = String::new();
sprintf!(=> &mut s, "%0.5g", 123456.0) // 1.2346e+05

See the crate documentation for additional examples.