diff --git a/src/libcore/extfmt.rs b/src/libcore/extfmt.rs index 86466bb8de12..30a3bc1ef693 100644 --- a/src/libcore/extfmt.rs +++ b/src/libcore/extfmt.rs @@ -339,7 +339,7 @@ mod rt { s = " " + s; } } - ret pad(cv, s, pad_signed); + ret pad(cv, s, pad_float); } fn conv_poly(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 { diff --git a/src/test/run-pass/syntax-extension-fmt.rs b/src/test/run-pass/syntax-extension-fmt.rs index 985b31770143..e6ec4b5dc37c 100644 --- a/src/test/run-pass/syntax-extension-fmt.rs +++ b/src/test/run-pass/syntax-extension-fmt.rs @@ -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");