Support #fmt precision for signed types
This commit is contained in:
parent
4c0aea69da
commit
8f6603f58e
@ -332,46 +332,13 @@ mod RT {
|
||||
ty ty);
|
||||
|
||||
fn conv_int(&conv cv, int i) -> str {
|
||||
ret pad(cv, _int.to_str(i, 10u));
|
||||
auto radix = 10u;
|
||||
auto prec = get_int_precision(cv);
|
||||
ret pad(cv, int_to_str_prec(i, radix, prec));
|
||||
}
|
||||
|
||||
fn conv_uint(&conv cv, uint u) -> str {
|
||||
|
||||
// Convert a uint to string with a minimum number of digits. If
|
||||
// precision is 0 and num is 0 then the result is the empty
|
||||
// string. Could move this to _str, but it doesn't seem all that
|
||||
// useful.
|
||||
fn uint_to_str_prec(uint num, uint radix, uint prec) -> str {
|
||||
auto s;
|
||||
|
||||
if (prec == 0u && num == 0u) {
|
||||
s = "";
|
||||
} else {
|
||||
s = _uint.to_str(num, radix);
|
||||
auto len = _str.char_len(s);
|
||||
if (len < prec) {
|
||||
auto diff = prec - len;
|
||||
auto pad = str_init_elt('0', diff);
|
||||
s = pad + s;
|
||||
}
|
||||
}
|
||||
|
||||
ret s;
|
||||
}
|
||||
|
||||
fn get_precision(&conv cv) -> uint {
|
||||
alt (cv.precision) {
|
||||
case (count_is(?c)) {
|
||||
ret c as uint;
|
||||
}
|
||||
case (count_implied) {
|
||||
ret 1u;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto prec = get_precision(cv);
|
||||
|
||||
auto prec = get_int_precision(cv);
|
||||
auto res;
|
||||
alt (cv.ty) {
|
||||
case (ty_default) {
|
||||
@ -418,6 +385,48 @@ mod RT {
|
||||
ret pad(cv, unpadded);
|
||||
}
|
||||
|
||||
// Convert an int to string with minimum number of digits. If precision is
|
||||
// 0 and num is 0 then the result is the empty string.
|
||||
fn int_to_str_prec(int num, uint radix, uint prec) -> str {
|
||||
if (num < 0) {
|
||||
ret "-" + uint_to_str_prec((-num) as uint, radix, prec);
|
||||
} else {
|
||||
ret uint_to_str_prec(num as uint, radix, prec);
|
||||
}
|
||||
}
|
||||
|
||||
// Convert a uint to string with a minimum number of digits. If precision
|
||||
// is 0 and num is 0 then the result is the empty string. Could move this
|
||||
// to _uint, but it doesn't seem all that useful.
|
||||
fn uint_to_str_prec(uint num, uint radix, uint prec) -> str {
|
||||
auto s;
|
||||
|
||||
if (prec == 0u && num == 0u) {
|
||||
s = "";
|
||||
} else {
|
||||
s = _uint.to_str(num, radix);
|
||||
auto len = _str.char_len(s);
|
||||
if (len < prec) {
|
||||
auto diff = prec - len;
|
||||
auto pad = str_init_elt('0', diff);
|
||||
s = pad + s;
|
||||
}
|
||||
}
|
||||
|
||||
ret s;
|
||||
}
|
||||
|
||||
fn get_int_precision(&conv cv) -> uint {
|
||||
alt (cv.precision) {
|
||||
case (count_is(?c)) {
|
||||
ret c as uint;
|
||||
}
|
||||
case (count_implied) {
|
||||
ret 1u;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: This might be useful in _str, but needs to be utf8 safe first
|
||||
fn str_init_elt(char c, uint n_elts) -> str {
|
||||
auto svec = _vec.init_elt[u8](c as u8, n_elts);
|
||||
|
@ -55,39 +55,47 @@ fn main() {
|
||||
test(#fmt("%-10t", 0xff_u), "11111111 ");
|
||||
|
||||
// Precision
|
||||
// test(#fmt("%.d", 0), "");
|
||||
test(#fmt("%.d", 0), "");
|
||||
test(#fmt("%.u", 0u), "");
|
||||
test(#fmt("%.x", 0u), "");
|
||||
// test(#fmt("%.d", 10), "10");
|
||||
// test(#fmt("%.d", -10), "-10");
|
||||
test(#fmt("%.t", 0u), "");
|
||||
test(#fmt("%.d", 10), "10");
|
||||
test(#fmt("%.d", -10), "-10");
|
||||
test(#fmt("%.u", 10u), "10");
|
||||
test(#fmt("%.s", "test"), "");
|
||||
test(#fmt("%.x", 127u), "7f");
|
||||
test(#fmt("%.t", 3u), "11");
|
||||
|
||||
// test(#fmt("%.0d", 0), "");
|
||||
test(#fmt("%.0d", 0), "");
|
||||
test(#fmt("%.0u", 0u), "");
|
||||
test(#fmt("%.0x", 0u), "");
|
||||
// test(#fmt("%.0d", 10), "10");
|
||||
// test(#fmt("%.0d", -10), "-10");
|
||||
test(#fmt("%.0t", 0u), "");
|
||||
test(#fmt("%.0d", 10), "10");
|
||||
test(#fmt("%.0d", -10), "-10");
|
||||
test(#fmt("%.0u", 10u), "10");
|
||||
test(#fmt("%.0s", "test"), "");
|
||||
test(#fmt("%.0x", 127u), "7f");
|
||||
test(#fmt("%.0t", 3u), "11");
|
||||
|
||||
// test(#fmt("%.1d", 0), "0");
|
||||
test(#fmt("%.1d", 0), "0");
|
||||
test(#fmt("%.1u", 0u), "0");
|
||||
test(#fmt("%.1x", 0u), "0");
|
||||
// test(#fmt("%.1d", 10), "10");
|
||||
// test(#fmt("%.1d", -10), "-10");
|
||||
test(#fmt("%.1t", 0u), "0");
|
||||
test(#fmt("%.1d", 10), "10");
|
||||
test(#fmt("%.1d", -10), "-10");
|
||||
test(#fmt("%.1u", 10u), "10");
|
||||
test(#fmt("%.1s", "test"), "t");
|
||||
test(#fmt("%.1x", 127u), "7f");
|
||||
test(#fmt("%.1t", 3u), "11");
|
||||
|
||||
// test(#fmt("%.5d", 0), "00000");
|
||||
test(#fmt("%.5d", 0), "00000");
|
||||
test(#fmt("%.5u", 0u), "00000");
|
||||
test(#fmt("%.5x", 0u), "00000");
|
||||
// test(#fmt("%.5d", 10), "00010");
|
||||
// test(#fmt("%.5d", -10), "-00010");
|
||||
test(#fmt("%.5t", 0u), "00000");
|
||||
test(#fmt("%.5d", 10), "00010");
|
||||
test(#fmt("%.5d", -10), "-00010");
|
||||
test(#fmt("%.5u", 10u), "00010");
|
||||
test(#fmt("%.5s", "test"), "test");
|
||||
test(#fmt("%.5x", 127u), "0007f");
|
||||
test(#fmt("%.5t", 3u), "00011");
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user