Rollup merge of #40241 - Sawyer47:fix-39997, r=alexcrichton
Change how the `0` flag works in format! Now it always implies right-alignment, so that padding zeroes are placed after the sign (if any) and before the digits. In other words, it always takes precedence over explicitly specified `[[fill]align]`. This also affects the '#' flag: zeroes are placed after the prefix (0b, 0o, 0x) and before the digits. Here's a short summary of how similar format strings work in Python and Rust: ``` :05 :<05 :>05 :^05 Python 3.6 |-0001| |-1000| |000-1| |0-100| Rust before |-0001| |-1000| |-0001| |-0100| Rust after |-0001| |-0001| |-0001| |-0001| :#05x :<#05x :>#05x :^#05x Python 3.6 |0x001| |0x100| |000x1| |00x10| Rust before |0x001| |0x100| |000x1| |0x010| Rust after |0x001| |0x001| |0x001| |0x001| ``` Fixes #39997 [breaking-change]
This commit is contained in:
commit
e5221f9397
@ -367,6 +367,10 @@
|
||||
//! like `{:08}` would yield `00000001` for the integer `1`, while the
|
||||
//! same format would yield `-0000001` for the integer `-1`. Notice that
|
||||
//! the negative version has one fewer zero than the positive version.
|
||||
//! Note that padding zeroes are always placed after the sign (if any)
|
||||
//! and before the digits. When used together with the `#` flag, a similar
|
||||
//! rule applies: padding zeroes are inserted after the prefix but before
|
||||
//! the digits.
|
||||
//!
|
||||
//! ## Width
|
||||
//!
|
||||
|
@ -1045,6 +1045,7 @@ impl<'a> Formatter<'a> {
|
||||
// is zero
|
||||
Some(min) if self.sign_aware_zero_pad() => {
|
||||
self.fill = '0';
|
||||
self.align = rt::v1::Alignment::Right;
|
||||
write_prefix(self)?;
|
||||
self.with_padding(min - width, rt::v1::Alignment::Right, |f| {
|
||||
f.buf.write_str(buf)
|
||||
@ -1153,8 +1154,9 @@ impl<'a> Formatter<'a> {
|
||||
// for the sign-aware zero padding, we render the sign first and
|
||||
// behave as if we had no sign from the beginning.
|
||||
let mut formatted = formatted.clone();
|
||||
let mut align = self.align;
|
||||
let old_fill = self.fill;
|
||||
let old_align = self.align;
|
||||
let mut align = old_align;
|
||||
if self.sign_aware_zero_pad() {
|
||||
// a sign always goes first
|
||||
let sign = unsafe { str::from_utf8_unchecked(formatted.sign) };
|
||||
@ -1165,6 +1167,7 @@ impl<'a> Formatter<'a> {
|
||||
width = if width < sign.len() { 0 } else { width - sign.len() };
|
||||
align = rt::v1::Alignment::Right;
|
||||
self.fill = '0';
|
||||
self.align = rt::v1::Alignment::Right;
|
||||
}
|
||||
|
||||
// remaining parts go through the ordinary padding process.
|
||||
@ -1177,6 +1180,7 @@ impl<'a> Formatter<'a> {
|
||||
})
|
||||
};
|
||||
self.fill = old_fill;
|
||||
self.align = old_align;
|
||||
ret
|
||||
} else {
|
||||
// this is the common case and we take a shortcut
|
||||
|
@ -160,6 +160,34 @@ pub fn main() {
|
||||
t!(format!("{:?}", -0.0), "-0");
|
||||
t!(format!("{:?}", 0.0), "0");
|
||||
|
||||
// sign aware zero padding
|
||||
t!(format!("{:<3}", 1), "1 ");
|
||||
t!(format!("{:>3}", 1), " 1");
|
||||
t!(format!("{:^3}", 1), " 1 ");
|
||||
t!(format!("{:03}", 1), "001");
|
||||
t!(format!("{:<03}", 1), "001");
|
||||
t!(format!("{:>03}", 1), "001");
|
||||
t!(format!("{:^03}", 1), "001");
|
||||
t!(format!("{:+03}", 1), "+01");
|
||||
t!(format!("{:<+03}", 1), "+01");
|
||||
t!(format!("{:>+03}", 1), "+01");
|
||||
t!(format!("{:^+03}", 1), "+01");
|
||||
t!(format!("{:#05x}", 1), "0x001");
|
||||
t!(format!("{:<#05x}", 1), "0x001");
|
||||
t!(format!("{:>#05x}", 1), "0x001");
|
||||
t!(format!("{:^#05x}", 1), "0x001");
|
||||
t!(format!("{:05}", 1.2), "001.2");
|
||||
t!(format!("{:<05}", 1.2), "001.2");
|
||||
t!(format!("{:>05}", 1.2), "001.2");
|
||||
t!(format!("{:^05}", 1.2), "001.2");
|
||||
t!(format!("{:05}", -1.2), "-01.2");
|
||||
t!(format!("{:<05}", -1.2), "-01.2");
|
||||
t!(format!("{:>05}", -1.2), "-01.2");
|
||||
t!(format!("{:^05}", -1.2), "-01.2");
|
||||
t!(format!("{:+05}", 1.2), "+01.2");
|
||||
t!(format!("{:<+05}", 1.2), "+01.2");
|
||||
t!(format!("{:>+05}", 1.2), "+01.2");
|
||||
t!(format!("{:^+05}", 1.2), "+01.2");
|
||||
|
||||
// Ergonomic format_args!
|
||||
t!(format!("{0:x} {0:X}", 15), "f F");
|
||||
|
Loading…
Reference in New Issue
Block a user