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