core: Fix handling of 0-padded floats with precision in #fmt

This commit is contained in:
Brian Anderson 2012-06-01 16:10:22 -07:00
parent 630c084da6
commit 7b862a5278
2 changed files with 9 additions and 4 deletions

View file

@ -339,7 +339,7 @@ mod rt {
s = " " + s;
}
}
ret pad(cv, s, pad_signed);
ret pad(cv, s, pad_float);
}
fn conv_poly<T>(cv: conv, v: T) -> str {
let s = sys::log_str(v);
@ -376,7 +376,7 @@ mod rt {
count_implied { 1u }
};
}
enum pad_mode { pad_signed, pad_unsigned, pad_nozero, }
enum pad_mode { pad_signed, pad_unsigned, pad_nozero, pad_float }
fn pad(cv: conv, &s: str, mode: pad_mode) -> str unsafe {
let uwidth : uint = alt cv.width {
count_implied { ret s; }
@ -396,6 +396,7 @@ mod rt {
let {might_zero_pad, signed} = alt mode {
pad_nozero { {might_zero_pad:false, signed:false} }
pad_signed { {might_zero_pad:true, signed:true } }
pad_float { {might_zero_pad:true, signed:true } }
pad_unsigned { {might_zero_pad:true, signed:false} }
};
fn have_precision(cv: conv) -> bool {
@ -403,7 +404,7 @@ mod rt {
}
let zero_padding = {
if might_zero_pad && have_flag(cv.flags, flag_left_zero_pad) &&
!have_precision(cv) {
(!have_precision(cv) || mode == pad_float) {
padchar = '0';
true
} else {

View file

@ -199,6 +199,7 @@ fn part5() {
}
fn part6() {
// Precision overrides 0-padding
// FIXME #2481: Recent gcc's report some of these as warnings
test(#fmt["%06.5d", 0], " 00000");
test(#fmt["%06.5u", 0u], " 00000");
@ -211,7 +212,10 @@ fn part6() {
test(#fmt["%06.5x", 127u], " 0007f");
test(#fmt["%06.5X", 127u], " 0007F");
test(#fmt["%06.5o", 10u], " 00012");
test(#fmt["%08.5f", 5.82], " 5.82000");
// Precision does not override zero-padding for floats
test(#fmt["%08.5f", 5.82], "05.82000");
// Signed combinations
test(#fmt["% 5d", 1], " 1");