|
80 | 80 | //! arguments which have names. Like with positional parameters, it is not
|
81 | 81 | //! valid to provide named parameters that are unused by the format string.
|
82 | 82 | //!
|
83 |
| -//! ## Argument types |
| 83 | +//! # Formatting Parameters |
| 84 | +//! |
| 85 | +//! Each argument being formatted can be transformed by a number of formatting |
| 86 | +//! parameters (corresponding to `format_spec` in the syntax above). These |
| 87 | +//! parameters affect the string representation of what's being formatted. |
| 88 | +//! |
| 89 | +//! ## Fill/Alignment |
| 90 | +//! |
| 91 | +//! The fill character is provided normally in conjunction with the |
| 92 | +//! [`width`](#width) |
| 93 | +//! parameter. This indicates that if the value being formatted is smaller than |
| 94 | +//! `width` some extra characters will be printed around it. The extra |
| 95 | +//! characters are specified by `fill`, and the alignment can be one of the |
| 96 | +//! following options: |
| 97 | +//! |
| 98 | +//! * `<` - the argument is left-aligned in `width` columns |
| 99 | +//! * `^` - the argument is center-aligned in `width` columns |
| 100 | +//! * `>` - the argument is right-aligned in `width` columns |
| 101 | +//! |
| 102 | +//! Note that alignment may not be implemented by some types. In particular, it |
| 103 | +//! is not generally implemented for the `Debug` trait. A good way to ensure |
| 104 | +//! padding is applied is to format your input, then use this resulting string |
| 105 | +//! to pad your output. |
| 106 | +//! |
| 107 | +//! ## Sign/`#`/`0` |
| 108 | +//! |
| 109 | +//! These can all be interpreted as flags for a particular formatter. |
| 110 | +//! |
| 111 | +//! * `+` - This is intended for numeric types and indicates that the sign |
| 112 | +//! should always be printed. Positive signs are never printed by |
| 113 | +//! default, and the negative sign is only printed by default for the |
| 114 | +//! `Signed` trait. This flag indicates that the correct sign (`+` or `-`) |
| 115 | +//! should always be printed. |
| 116 | +//! * `-` - Currently not used |
| 117 | +//! * `#` - This flag is indicates that the "alternate" form of printing should |
| 118 | +//! be used. The alternate forms are: |
| 119 | +//! * `#?` - pretty-print the [`Debug`] formatting |
| 120 | +//! * `#x` - precedes the argument with a `0x` |
| 121 | +//! * `#X` - precedes the argument with a `0x` |
| 122 | +//! * `#b` - precedes the argument with a `0b` |
| 123 | +//! * `#o` - precedes the argument with a `0o` |
| 124 | +//! * `0` - This is used to indicate for integer formats that the padding should |
| 125 | +//! both be done with a `0` character as well as be sign-aware. A format |
| 126 | +//! like `{:08}` would yield `00000001` for the integer `1`, while the |
| 127 | +//! same format would yield `-0000001` for the integer `-1`. Notice that |
| 128 | +//! the negative version has one fewer zero than the positive version. |
| 129 | +//! Note that padding zeroes are always placed after the sign (if any) |
| 130 | +//! and before the digits. When used together with the `#` flag, a similar |
| 131 | +//! rule applies: padding zeroes are inserted after the prefix but before |
| 132 | +//! the digits. |
| 133 | +//! |
| 134 | +//! ## Width |
| 135 | +//! |
| 136 | +//! This is a parameter for the "minimum width" that the format should take up. |
| 137 | +//! If the value's string does not fill up this many characters, then the |
| 138 | +//! padding specified by fill/alignment will be used to take up the required |
| 139 | +//! space. |
| 140 | +//! |
| 141 | +//! The default [fill/alignment](#fillalignment) for non-numerics is a space and |
| 142 | +//! left-aligned. The |
| 143 | +//! defaults for numeric formatters is also a space but with right-alignment. If |
| 144 | +//! the `0` flag is specified for numerics, then the implicit fill character is |
| 145 | +//! `0`. |
| 146 | +//! |
| 147 | +//! The value for the width can also be provided as a [`usize`] in the list of |
| 148 | +//! parameters by using the dollar syntax indicating that the second argument is |
| 149 | +//! a [`usize`] specifying the width, for example: |
| 150 | +//! |
| 151 | +//! ``` |
| 152 | +//! // All of these print "Hello x !" |
| 153 | +//! println!("Hello {:5}!", "x"); |
| 154 | +//! println!("Hello {:1$}!", "x", 5); |
| 155 | +//! println!("Hello {1:0$}!", 5, "x"); |
| 156 | +//! println!("Hello {:width$}!", "x", width = 5); |
| 157 | +//! ``` |
| 158 | +//! |
| 159 | +//! Referring to an argument with the dollar syntax does not affect the "next |
| 160 | +//! argument" counter, so it's usually a good idea to refer to arguments by |
| 161 | +//! position, or use named arguments. |
| 162 | +//! |
| 163 | +//! ## Precision |
| 164 | +//! |
| 165 | +//! For non-numeric types, this can be considered a "maximum width". If the resulting string is |
| 166 | +//! longer than this width, then it is truncated down to this many characters and that truncated |
| 167 | +//! value is emitted with proper `fill`, `alignment` and `width` if those parameters are set. |
| 168 | +//! |
| 169 | +//! For integral types, this is ignored. |
| 170 | +//! |
| 171 | +//! For floating-point types, this indicates how many digits after the decimal point should be |
| 172 | +//! printed. |
| 173 | +//! |
| 174 | +//! There are three possible ways to specify the desired `precision`: |
| 175 | +//! |
| 176 | +//! 1. An integer `.N`: |
| 177 | +//! |
| 178 | +//! the integer `N` itself is the precision. |
| 179 | +//! |
| 180 | +//! 2. An integer or name followed by dollar sign `.N$`: |
| 181 | +//! |
| 182 | +//! use format *argument* `N` (which must be a `usize`) as the precision. |
| 183 | +//! |
| 184 | +//! 3. An asterisk `.*`: |
| 185 | +//! |
| 186 | +//! `.*` means that this `{...}` is associated with *two* format inputs rather than one: the |
| 187 | +//! first input holds the `usize` precision, and the second holds the value to print. Note that |
| 188 | +//! in this case, if one uses the format string `{<arg>:<spec>.*}`, then the `<arg>` part refers |
| 189 | +//! to the *value* to print, and the `precision` must come in the input preceding `<arg>`. |
| 190 | +//! |
| 191 | +//! For example, the following calls all print the same thing `Hello x is 0.01000`: |
| 192 | +//! |
| 193 | +//! ``` |
| 194 | +//! // Hello {arg 0 ("x")} is {arg 1 (0.01) with precision specified inline (5)} |
| 195 | +//! println!("Hello {0} is {1:.5}", "x", 0.01); |
| 196 | +//! |
| 197 | +//! // Hello {arg 1 ("x")} is {arg 2 (0.01) with precision specified in arg 0 (5)} |
| 198 | +//! println!("Hello {1} is {2:.0$}", 5, "x", 0.01); |
| 199 | +//! |
| 200 | +//! // Hello {arg 0 ("x")} is {arg 2 (0.01) with precision specified in arg 1 (5)} |
| 201 | +//! println!("Hello {0} is {2:.1$}", "x", 5, 0.01); |
| 202 | +//! |
| 203 | +//! // Hello {next arg ("x")} is {second of next two args (0.01) with precision |
| 204 | +//! // specified in first of next two args (5)} |
| 205 | +//! println!("Hello {} is {:.*}", "x", 5, 0.01); |
| 206 | +//! |
| 207 | +//! // Hello {next arg ("x")} is {arg 2 (0.01) with precision |
| 208 | +//! // specified in its predecessor (5)} |
| 209 | +//! println!("Hello {} is {2:.*}", "x", 5, 0.01); |
| 210 | +//! |
| 211 | +//! // Hello {next arg ("x")} is {arg "number" (0.01) with precision specified |
| 212 | +//! // in arg "prec" (5)} |
| 213 | +//! println!("Hello {} is {number:.prec$}", "x", prec = 5, number = 0.01); |
| 214 | +//! ``` |
84 | 215 | //!
|
85 |
| -//! Each argument's type is dictated by the format string. |
86 |
| -//! There are various parameters which require a particular type, however. |
87 |
| -//! An example is the `{:.*}` syntax, which sets the number of decimal places |
88 |
| -//! in floating-point types: |
| 216 | +//! While these: |
89 | 217 | //!
|
90 | 218 | //! ```
|
91 |
| -//! let formatted_number = format!("{:.*}", 2, 1.234567); |
| 219 | +//! println!("{}, `{name:.*}` has 3 fractional digits", "Hello", 3, name=1234.56); |
| 220 | +//! println!("{}, `{name:.*}` has 3 characters", "Hello", 3, name="1234.56"); |
| 221 | +//! println!("{}, `{name:>8.*}` has 3 right-aligned characters", "Hello", 3, name="1234.56"); |
| 222 | +//! ``` |
92 | 223 | //!
|
93 |
| -//! assert_eq!("1.23", formatted_number) |
| 224 | +//! print two significantly different things: |
| 225 | +//! |
| 226 | +//! ```text |
| 227 | +//! Hello, `1234.560` has 3 fractional digits |
| 228 | +//! Hello, `123` has 3 characters |
| 229 | +//! Hello, ` 123` has 3 right-aligned characters |
94 | 230 | //! ```
|
95 | 231 | //!
|
96 |
| -//! If this syntax is used, then the number of characters to print precedes the |
97 |
| -//! actual object being formatted, and the number of characters must have the |
98 |
| -//! type [`usize`]. |
| 232 | +//! # Escaping |
| 233 | +//! |
| 234 | +//! The literal characters `{` and `}` may be included in a string by preceding |
| 235 | +//! them with the same character. For example, the `{` character is escaped with |
| 236 | +//! `{{` and the `}` character is escaped with `}}`. |
| 237 | +//! |
| 238 | +//! # Syntax |
| 239 | +//! |
| 240 | +//! To summarize, you can find the full grammar of format strings. |
| 241 | +//! The syntax for the formatting language used is drawn from other languages, |
| 242 | +//! so it should not be too alien. Arguments are formatted with Python-like |
| 243 | +//! syntax, meaning that arguments are surrounded by `{}` instead of the C-like |
| 244 | +//! `%`. The actual grammar for the formatting syntax is: |
| 245 | +//! |
| 246 | +//! ```text |
| 247 | +//! format_string := <text> [ maybe-format <text> ] * |
| 248 | +//! maybe-format := '{' '{' | '}' '}' | <format> |
| 249 | +//! format := '{' [ argument ] [ ':' format_spec ] '}' |
| 250 | +//! argument := integer | identifier |
| 251 | +//! |
| 252 | +//! format_spec := [[fill]align][sign]['#']['0'][width]['.' precision][type] |
| 253 | +//! fill := character |
| 254 | +//! align := '<' | '^' | '>' |
| 255 | +//! sign := '+' | '-' |
| 256 | +//! width := count |
| 257 | +//! precision := count | '*' |
| 258 | +//! type := identifier | '?' | '' |
| 259 | +//! count := parameter | integer |
| 260 | +//! parameter := argument '$' |
| 261 | +//! ``` |
99 | 262 | //!
|
100 |
| -//! ## Formatting traits |
| 263 | +//! # Formatting traits |
101 | 264 | //!
|
102 | 265 | //! When requesting that an argument be formatted with a particular type, you
|
103 | 266 | //! are actually requesting that an argument ascribes to a particular trait.
|
|
220 | 383 | //! assert_eq!(format!("{} {:?}", "foo\n", "bar\n"), "foo\n \"bar\\n\"");
|
221 | 384 | //! ```
|
222 | 385 | //!
|
223 |
| -//! ## Related macros |
| 386 | +//! # Related macros |
224 | 387 | //!
|
225 | 388 | //! There are a number of related macros in the [`format!`] family. The ones that
|
226 | 389 | //! are currently implemented are:
|
|
300 | 463 | //! it would internally pass around this structure until it has been determined
|
301 | 464 | //! where output should go to.
|
302 | 465 | //!
|
303 |
| -//! # Syntax |
304 |
| -//! |
305 |
| -//! The syntax for the formatting language used is drawn from other languages, |
306 |
| -//! so it should not be too alien. Arguments are formatted with Python-like |
307 |
| -//! syntax, meaning that arguments are surrounded by `{}` instead of the C-like |
308 |
| -//! `%`. The actual grammar for the formatting syntax is: |
309 |
| -//! |
310 |
| -//! ```text |
311 |
| -//! format_string := <text> [ maybe-format <text> ] * |
312 |
| -//! maybe-format := '{' '{' | '}' '}' | <format> |
313 |
| -//! format := '{' [ argument ] [ ':' format_spec ] '}' |
314 |
| -//! argument := integer | identifier |
315 |
| -//! |
316 |
| -//! format_spec := [[fill]align][sign]['#']['0'][width]['.' precision][type] |
317 |
| -//! fill := character |
318 |
| -//! align := '<' | '^' | '>' |
319 |
| -//! sign := '+' | '-' |
320 |
| -//! width := count |
321 |
| -//! precision := count | '*' |
322 |
| -//! type := identifier | '?' | '' |
323 |
| -//! count := parameter | integer |
324 |
| -//! parameter := argument '$' |
325 |
| -//! ``` |
326 |
| -//! |
327 |
| -//! # Formatting Parameters |
328 |
| -//! |
329 |
| -//! Each argument being formatted can be transformed by a number of formatting |
330 |
| -//! parameters (corresponding to `format_spec` in the syntax above). These |
331 |
| -//! parameters affect the string representation of what's being formatted. |
332 |
| -//! |
333 |
| -//! ## Fill/Alignment |
334 |
| -//! |
335 |
| -//! The fill character is provided normally in conjunction with the |
336 |
| -//! [`width`](#width) |
337 |
| -//! parameter. This indicates that if the value being formatted is smaller than |
338 |
| -//! `width` some extra characters will be printed around it. The extra |
339 |
| -//! characters are specified by `fill`, and the alignment can be one of the |
340 |
| -//! following options: |
341 |
| -//! |
342 |
| -//! * `<` - the argument is left-aligned in `width` columns |
343 |
| -//! * `^` - the argument is center-aligned in `width` columns |
344 |
| -//! * `>` - the argument is right-aligned in `width` columns |
345 |
| -//! |
346 |
| -//! Note that alignment may not be implemented by some types. In particular, it |
347 |
| -//! is not generally implemented for the `Debug` trait. A good way to ensure |
348 |
| -//! padding is applied is to format your input, then use this resulting string |
349 |
| -//! to pad your output. |
350 |
| -//! |
351 |
| -//! ## Sign/`#`/`0` |
352 |
| -//! |
353 |
| -//! These can all be interpreted as flags for a particular formatter. |
354 |
| -//! |
355 |
| -//! * `+` - This is intended for numeric types and indicates that the sign |
356 |
| -//! should always be printed. Positive signs are never printed by |
357 |
| -//! default, and the negative sign is only printed by default for the |
358 |
| -//! `Signed` trait. This flag indicates that the correct sign (`+` or `-`) |
359 |
| -//! should always be printed. |
360 |
| -//! * `-` - Currently not used |
361 |
| -//! * `#` - This flag is indicates that the "alternate" form of printing should |
362 |
| -//! be used. The alternate forms are: |
363 |
| -//! * `#?` - pretty-print the [`Debug`] formatting |
364 |
| -//! * `#x` - precedes the argument with a `0x` |
365 |
| -//! * `#X` - precedes the argument with a `0x` |
366 |
| -//! * `#b` - precedes the argument with a `0b` |
367 |
| -//! * `#o` - precedes the argument with a `0o` |
368 |
| -//! * `0` - This is used to indicate for integer formats that the padding should |
369 |
| -//! both be done with a `0` character as well as be sign-aware. A format |
370 |
| -//! like `{:08}` would yield `00000001` for the integer `1`, while the |
371 |
| -//! same format would yield `-0000001` for the integer `-1`. Notice that |
372 |
| -//! the negative version has one fewer zero than the positive version. |
373 |
| -//! Note that padding zeroes are always placed after the sign (if any) |
374 |
| -//! and before the digits. When used together with the `#` flag, a similar |
375 |
| -//! rule applies: padding zeroes are inserted after the prefix but before |
376 |
| -//! the digits. |
377 |
| -//! |
378 |
| -//! ## Width |
379 |
| -//! |
380 |
| -//! This is a parameter for the "minimum width" that the format should take up. |
381 |
| -//! If the value's string does not fill up this many characters, then the |
382 |
| -//! padding specified by fill/alignment will be used to take up the required |
383 |
| -//! space. |
384 |
| -//! |
385 |
| -//! The default [fill/alignment](#fillalignment) for non-numerics is a space and |
386 |
| -//! left-aligned. The |
387 |
| -//! defaults for numeric formatters is also a space but with right-alignment. If |
388 |
| -//! the `0` flag is specified for numerics, then the implicit fill character is |
389 |
| -//! `0`. |
390 |
| -//! |
391 |
| -//! The value for the width can also be provided as a [`usize`] in the list of |
392 |
| -//! parameters by using the dollar syntax indicating that the second argument is |
393 |
| -//! a [`usize`] specifying the width, for example: |
394 |
| -//! |
395 |
| -//! ``` |
396 |
| -//! // All of these print "Hello x !" |
397 |
| -//! println!("Hello {:5}!", "x"); |
398 |
| -//! println!("Hello {:1$}!", "x", 5); |
399 |
| -//! println!("Hello {1:0$}!", 5, "x"); |
400 |
| -//! println!("Hello {:width$}!", "x", width = 5); |
401 |
| -//! ``` |
402 |
| -//! |
403 |
| -//! Referring to an argument with the dollar syntax does not affect the "next |
404 |
| -//! argument" counter, so it's usually a good idea to refer to arguments by |
405 |
| -//! position, or use named arguments. |
406 |
| -//! |
407 |
| -//! ## Precision |
408 |
| -//! |
409 |
| -//! For non-numeric types, this can be considered a "maximum width". If the resulting string is |
410 |
| -//! longer than this width, then it is truncated down to this many characters and that truncated |
411 |
| -//! value is emitted with proper `fill`, `alignment` and `width` if those parameters are set. |
412 |
| -//! |
413 |
| -//! For integral types, this is ignored. |
414 |
| -//! |
415 |
| -//! For floating-point types, this indicates how many digits after the decimal point should be |
416 |
| -//! printed. |
417 |
| -//! |
418 |
| -//! There are three possible ways to specify the desired `precision`: |
419 |
| -//! |
420 |
| -//! 1. An integer `.N`: |
421 |
| -//! |
422 |
| -//! the integer `N` itself is the precision. |
423 |
| -//! |
424 |
| -//! 2. An integer or name followed by dollar sign `.N$`: |
425 |
| -//! |
426 |
| -//! use format *argument* `N` (which must be a `usize`) as the precision. |
427 |
| -//! |
428 |
| -//! 3. An asterisk `.*`: |
429 |
| -//! |
430 |
| -//! `.*` means that this `{...}` is associated with *two* format inputs rather than one: the |
431 |
| -//! first input holds the `usize` precision, and the second holds the value to print. Note that |
432 |
| -//! in this case, if one uses the format string `{<arg>:<spec>.*}`, then the `<arg>` part refers |
433 |
| -//! to the *value* to print, and the `precision` must come in the input preceding `<arg>`. |
434 |
| -//! |
435 |
| -//! For example, the following calls all print the same thing `Hello x is 0.01000`: |
436 |
| -//! |
437 |
| -//! ``` |
438 |
| -//! // Hello {arg 0 ("x")} is {arg 1 (0.01) with precision specified inline (5)} |
439 |
| -//! println!("Hello {0} is {1:.5}", "x", 0.01); |
440 |
| -//! |
441 |
| -//! // Hello {arg 1 ("x")} is {arg 2 (0.01) with precision specified in arg 0 (5)} |
442 |
| -//! println!("Hello {1} is {2:.0$}", 5, "x", 0.01); |
443 |
| -//! |
444 |
| -//! // Hello {arg 0 ("x")} is {arg 2 (0.01) with precision specified in arg 1 (5)} |
445 |
| -//! println!("Hello {0} is {2:.1$}", "x", 5, 0.01); |
446 |
| -//! |
447 |
| -//! // Hello {next arg ("x")} is {second of next two args (0.01) with precision |
448 |
| -//! // specified in first of next two args (5)} |
449 |
| -//! println!("Hello {} is {:.*}", "x", 5, 0.01); |
450 |
| -//! |
451 |
| -//! // Hello {next arg ("x")} is {arg 2 (0.01) with precision |
452 |
| -//! // specified in its predecessor (5)} |
453 |
| -//! println!("Hello {} is {2:.*}", "x", 5, 0.01); |
454 |
| -//! |
455 |
| -//! // Hello {next arg ("x")} is {arg "number" (0.01) with precision specified |
456 |
| -//! // in arg "prec" (5)} |
457 |
| -//! println!("Hello {} is {number:.prec$}", "x", prec = 5, number = 0.01); |
458 |
| -//! ``` |
459 |
| -//! |
460 |
| -//! While these: |
461 |
| -//! |
462 |
| -//! ``` |
463 |
| -//! println!("{}, `{name:.*}` has 3 fractional digits", "Hello", 3, name=1234.56); |
464 |
| -//! println!("{}, `{name:.*}` has 3 characters", "Hello", 3, name="1234.56"); |
465 |
| -//! println!("{}, `{name:>8.*}` has 3 right-aligned characters", "Hello", 3, name="1234.56"); |
466 |
| -//! ``` |
467 |
| -//! |
468 |
| -//! print two significantly different things: |
469 |
| -//! |
470 |
| -//! ```text |
471 |
| -//! Hello, `1234.560` has 3 fractional digits |
472 |
| -//! Hello, `123` has 3 characters |
473 |
| -//! Hello, ` 123` has 3 right-aligned characters |
474 |
| -//! ``` |
475 |
| -//! |
476 |
| -//! # Escaping |
477 |
| -//! |
478 |
| -//! The literal characters `{` and `}` may be included in a string by preceding |
479 |
| -//! them with the same character. For example, the `{` character is escaped with |
480 |
| -//! `{{` and the `}` character is escaped with `}}`. |
481 |
| -//! |
482 | 466 | //! [`usize`]: ../../std/primitive.usize.html
|
483 | 467 | //! [`isize`]: ../../std/primitive.isize.html
|
484 | 468 | //! [`i8`]: ../../std/primitive.i8.html
|
|
0 commit comments