diff options
| author | Brian Anderson <[email protected]> | 2011-04-17 16:48:03 -0400 |
|---|---|---|
| committer | Brian Anderson <[email protected]> | 2011-04-17 16:51:17 -0400 |
| commit | 8f6603f58ec7247c585f795413ff5b4ddf409c49 (patch) | |
| tree | 401f1de8cd40ce027f37130b7560adbcd38fd58a /src/lib | |
| parent | Support #fmt precision for unsigned types (diff) | |
| download | rust-8f6603f58ec7247c585f795413ff5b4ddf409c49.tar.xz rust-8f6603f58ec7247c585f795413ff5b4ddf409c49.zip | |
Support #fmt precision for signed types
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/ExtFmt.rs | 83 |
1 files changed, 46 insertions, 37 deletions
diff --git a/src/lib/ExtFmt.rs b/src/lib/ExtFmt.rs index f8c542c6..23290384 100644 --- a/src/lib/ExtFmt.rs +++ b/src/lib/ExtFmt.rs @@ -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); |