diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs index be75bfec32c86..3244a72897fbb 100644 --- a/src/libcore/fmt/mod.rs +++ b/src/libcore/fmt/mod.rs @@ -476,7 +476,7 @@ impl<'a> Formatter<'a> { 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 @@ impl<'a> Formatter<'a> { // 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()) }) } diff --git a/src/test/run-pass/ifmt.rs b/src/test/run-pass/ifmt.rs index d582209a79eb1..78e17bb22bd03 100644 --- a/src/test/run-pass/ifmt.rs +++ b/src/test/run-pass/ifmt.rs @@ -25,6 +25,7 @@ use std::str; struct A; struct B; +struct C; impl fmt::Signed for A { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { @@ -36,6 +37,11 @@ impl fmt::Signed for B { 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 ");