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.
fish-printf
The printf implementation used in fish-shell, based on musl printf.
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
%nmodifier 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.