Format Syntax
format_string := text [ maybe_format text ] *
maybe_format := '{' '{' | '}' '}' | format
format := '{' [ argument ] [ ':' format_spec ] [ ws ] * '}'
argument := integer | identifier
format_spec := [[fill]align][sign]['#']['0'][width]['.' precision]type
fill := character
align := '<' | '^' | '>'
sign := '+' | '-'
width := count
precision := count | '*'
type := '' | '?' | 'x?' | 'X?' | identifier
count := parameter | integer
parameter := argument '$'
{[argument]':'[[fill] align][sign]['#'][width [$]]['.' precision [$]][type]}
-
argument => number(0, 1, 2, ..) or name
#![allow(unused)] fn main() { println!("{0} {1}", "arg_1", "arg_2"); // with argument number let arg_1 = "arg_1"; let arg_2 = "arg_2"; println!("{arg_1} {arg_2}"); // with argument name }
-
fill => the character to fill empty spaces, if
width
is specified -
align => left(<), center (^), right (>), if
width
is specified#![allow(unused)] fn main() { println!("{:!>6}", "@@"); // !!!!@@ println!("{0:!<6}", "@@"); // @@!!!! let double_at = "@@"; println!("{double_at:!^6}"); // !!@@!! }
-
width [$] => width to be padded with
fill
(default to space), can be number or paramater, if paramater '$' must be used#![allow(unused)] fn main() { println!("{:0width$}", 1, width = 4); // 0001 println!("{:0<width$}", 1, width = 4); // 1000 println!("{:0^width$}", 1, width = 4); // 0100 println!("{:01$}", 1, width = 4); // 0001 println!("{:0<1$}", 1, width = 4); // 1000 println!("{:0^1$}", 1, width = 4); // 0100 println!("{:!>width$}", "1", width = 4); // !!!1 println!("{:!<width$}", "1", width = 4); // 1!!! println!("{:!^width$}", "1", width = 4); // !1!! println!("{:>4}", 1); // padded with space (space is default) }
-
sign =>
+
can be used for numeric types to display sign (negative sign is only displayed for signed values)#![allow(unused)] fn main() { println!("{}", 1000); // 1000 println!("{:+}", 1000); // +1000 }
-
precision [$] => decimal digits for number or max width for non-number, can be number or paramater, if paramater '$' must be used.
.*
means that this {...} is associated with two format inputs rather than one:#![allow(unused)] fn main() { // the output of all lines below is // => Hello x is 0.01000 println!("Hello {0} is {1:.5}", "x", 0.01); println!("Hello {1} is {2:.0$}", 5, "x", 0.01); println!("Hello {0} is {2:.1$}", "x", 5, 0.01); println!("Hello {} is {:.*}", "x", 5, 0.01); println!("Hello {1} is {2:.*}", 5, "x", 0.01); println!("Hello {} is {2:.*}", "x", 5, 0.01); println!("Hello {} is {number:.prec$}", "x", prec = 5, number = 0.01); }
-
#
indicates that the "alternate” form of printing should be used. The alternate forms are:#?
pretty-print the Debug formatting (adds linebreaks and indentation)#x
precedes the argument with a 0x#X
precedes the argument with a 0x#b
precedes the argument with a 0b#o
precedes the argument with a 0o
#![allow(unused)] fn main() { println!("{:#?}", "test"); // => "test" println!("{:#x}", 16); // => 0x10 println!("{:#X}", 16); // => 0x10 println!("{:#b}", 2); // => 0b10 println!("{:#o}", 8); // => 0o10 println!("{:#?}", (1, "one", 3.3)); // => ( // 1, // "one", // 3.3, // ) }
Formatting Traits
- nothing ⇒ Display
- ? ⇒ Debug
- x? ⇒ Debug with lower-case hexadecimal integers
- X? ⇒ Debug with upper-case hexadecimal integers
- o ⇒ Octal
- x ⇒ LowerHex
- X ⇒ UpperHex
- p ⇒ Pointer
- b ⇒ Binary
- e ⇒ LowerExp
- E ⇒ UpperExp