Skip to content

Commit ff63866

Browse files
Sawyer47alexcrichton
authored andcommitted
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. :05 :<05 :>05 :^05 before |-0001| |-1000| |-0001| |-0100| after |-0001| |-0001| |-0001| |-0001| :#05x :<#05x :>#05x :^#05x before |0x001| |0x100| |000x1| |0x010| after |0x001| |0x001| |0x001| |0x001| Fixes rust-lang#39997 [breaking-change]
1 parent 6f10e2f commit ff63866

File tree

3 files changed

+21
-0
lines changed

3 files changed

+21
-0
lines changed

src/libcollections/fmt.rs

+4
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,10 @@
366366
//! like `{:08}` would yield `00000001` for the integer `1`, while the
367367
//! same format would yield `-0000001` for the integer `-1`. Notice that
368368
//! the negative version has one fewer zero than the positive version.
369+
//! Note that padding zeroes are always placed after the sign (if any)
370+
//! and before the digits. When used together with the `#` flag, a similar
371+
//! rule applies: padding zeroes are inserted after the prefix but before
372+
//! the digits.
369373
//!
370374
//! ## Width
371375
//!

src/libcore/fmt/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1045,6 +1045,7 @@ impl<'a> Formatter<'a> {
10451045
// is zero
10461046
Some(min) if self.sign_aware_zero_pad() => {
10471047
self.fill = '0';
1048+
self.align = rt::v1::Alignment::Right;
10481049
write_prefix(self)?;
10491050
self.with_padding(min - width, rt::v1::Alignment::Right, |f| {
10501051
f.buf.write_str(buf)

src/test/run-pass/ifmt.rs

+16
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,22 @@ pub fn main() {
160160
t!(format!("{:?}", -0.0), "-0");
161161
t!(format!("{:?}", 0.0), "0");
162162

163+
// sign aware zero padding
164+
t!(format!("{:<3}", 1), "1 ");
165+
t!(format!("{:>3}", 1), " 1");
166+
t!(format!("{:^3}", 1), " 1 ");
167+
t!(format!("{:03}", 1), "001");
168+
t!(format!("{:<03}", 1), "001");
169+
t!(format!("{:>03}", 1), "001");
170+
t!(format!("{:^03}", 1), "001");
171+
t!(format!("{:+03}", 1), "+01");
172+
t!(format!("{:<+03}", 1), "+01");
173+
t!(format!("{:>+03}", 1), "+01");
174+
t!(format!("{:^+03}", 1), "+01");
175+
t!(format!("{:#05x}", 1), "0x001");
176+
t!(format!("{:<#05x}", 1), "0x001");
177+
t!(format!("{:>#05x}", 1), "0x001");
178+
t!(format!("{:^#05x}", 1), "0x001");
163179

164180
// Ergonomic format_args!
165181
t!(format!("{0:x} {0:X}", 15), "f F");

0 commit comments

Comments
 (0)