about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPiotr Jawniak <sawyer47@gmail.com>2017-03-04 21:29:17 +0100
committerAlex Crichton <alex@alexcrichton.com>2017-03-15 07:50:44 -0700
commit80654862831e27f249f05bcb50552510f1b5f643 (patch)
treeabeb7612df8326f2050a594c3d12e13a2afd74cd
parentff63866edb511a73eed657a8a4f5c81f1ee5a9bb (diff)
downloadrust-80654862831e27f249f05bcb50552510f1b5f643.tar.gz
rust-80654862831e27f249f05bcb50552510f1b5f643.zip
Change how the 0 flag works in format! for floats
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]`.

               :06      :<06     :>06     :^06
    before   |-001.2| |-1.200| |-001.2| |-01.20|
    after    |-001.2| |-001.2| |-001.2| |-001.2|
-rw-r--r--src/libcore/fmt/mod.rs5
-rw-r--r--src/test/run-pass/ifmt.rs12
2 files changed, 16 insertions, 1 deletions
diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs
index fd77201317f..0bfab92fa5d 100644
--- a/src/libcore/fmt/mod.rs
+++ b/src/libcore/fmt/mod.rs
@@ -1154,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) };
@@ -1166,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.
@@ -1178,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
diff --git a/src/test/run-pass/ifmt.rs b/src/test/run-pass/ifmt.rs
index dcd3920ffd9..cef2f879f9c 100644
--- a/src/test/run-pass/ifmt.rs
+++ b/src/test/run-pass/ifmt.rs
@@ -176,6 +176,18 @@ pub fn main() {
     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");