Fix bug in padding unicode, #17105.

This commit is contained in:
Ahmed Charles 2014-09-11 17:39:57 -07:00
parent 06c0b1d28a
commit 5b3c3511c9
2 changed files with 10 additions and 2 deletions

View File

@ -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())
})
}

View File

@ -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 ");