提交 8f6603f5 编写于 作者: B Brian Anderson

Support #fmt precision for signed types

上级 4c0aea69
......@@ -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 @@ fn conv_str(&conv cv, str s) -> str {
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");
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册