]> git.lizzy.rs Git - rust.git/commitdiff
Fix bug in padding unicode, #17105.
authorAhmed Charles <acharles@outlook.com>
Fri, 12 Sep 2014 00:39:57 +0000 (17:39 -0700)
committerAhmed Charles <acharles@outlook.com>
Fri, 12 Sep 2014 00:40:46 +0000 (17:40 -0700)
src/libcore/fmt/mod.rs
src/test/run-pass/ifmt.rs

index be75bfec32c86dd9fb172a5e42ce8dbbee0c39fd..3244a72897fbb1eeb75fd2a0fb16233b5068a78a 100644 (file)
@@ -476,7 +476,7 @@ pub fn pad_integral(&mut self,
 
         let mut prefixed = false;
         if self.flags & (1 << (FlagAlternate as uint)) != 0 {
-            prefixed = true; width += prefix.len();
+            prefixed = true; width += prefix.char_len();
         }
 
         // Writes the sign if it exists, and then the prefix if it was requested
@@ -562,7 +562,7 @@ pub fn pad(&mut self, s: &str) -> Result {
             // If we're under both the maximum and the minimum width, then fill
             // up the minimum width with the specified string + some alignment.
             Some(width) => {
-                self.with_padding(width - s.len(), rt::AlignLeft, |me| {
+                self.with_padding(width - s.char_len(), rt::AlignLeft, |me| {
                     me.buf.write(s.as_bytes())
                 })
             }
index d582209a79eb1d36886ec70b44ac4dc8ca8d4cfc..78e17bb22bd0315c85abb1467a58adeb39efceb1 100644 (file)
@@ -25,6 +25,7 @@
 
 struct A;
 struct B;
+struct C;
 
 impl fmt::Signed for A {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
@@ -36,6 +37,11 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         f.write("adios".as_bytes())
     }
 }
+impl fmt::Show for C {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.pad_integral(true, "☃", "123".as_bytes())
+    }
+}
 
 macro_rules! t(($a:expr, $b:expr) => { assert_eq!($a.as_slice(), $b) })
 
@@ -81,6 +87,7 @@ pub fn main() {
     t!(format!("{} {0}", "a"), "a a");
     t!(format!("{foo_bar}", foo_bar=1i), "1");
     t!(format!("{:d}", 5i + 5i), "10");
+    t!(format!("{:#4}", C), "☃123");
 
     let a: &fmt::Show = &1i;
     t!(format!("{}", a), "1");
@@ -88,6 +95,7 @@ pub fn main() {
     // Formatting strings and their arguments
     t!(format!("{:s}", "a"), "a");
     t!(format!("{:4s}", "a"), "a   ");
+    t!(format!("{:4s}", "☃"), "☃   ");
     t!(format!("{:>4s}", "a"), "   a");
     t!(format!("{:<4s}", "a"), "a   ");
     t!(format!("{:^5s}", "a"),  "  a  ");