X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fstrings%2Flexicalcast.cpp;h=f5b3a95ee9af7ea0db2e1865b709dadf77dbf1de;hb=9f754b788b872f9768af8c3a4f9e001a588e011a;hp=6a226e1d27ac5ff356589c4e59f06c65085ebde4;hpb=c29459b08eca95418fbdee714a1c59f3becdb2ce;p=libs%2Fcore.git diff --git a/source/strings/lexicalcast.cpp b/source/strings/lexicalcast.cpp index 6a226e1..f5b3a95 100644 --- a/source/strings/lexicalcast.cpp +++ b/source/strings/lexicalcast.cpp @@ -59,7 +59,7 @@ char *int_to_str(T v, const Fmt &f, char *end) const char *digits = (f.get_uppercase() ? udigits : ldigits); if(v) { - typename MatchingInt::UnsignedType w = Absolute::eval(v); + typename std::make_unsigned::type w = Absolute::eval(v); while(w) { *--ptr = digits[w%base]; @@ -108,12 +108,12 @@ string int_to_str(T v, const Fmt &f) } template -T str_to_int(const std::string &s, const Fmt &f) +T str_to_int(const string &s, const Fmt &f) { if(s.empty()) throw lexical_error("conversion of '' to integer"); - std::string::const_iterator i = s.begin(); + string::const_iterator i = s.begin(); // See if the input starts with a sign bool neg = false; @@ -237,7 +237,7 @@ string flt_to_str(T v, const Fmt &f) if(w>=10) { long double div = 1; - while(div*10(digits)); - if(w>10) + if(w>=10) { // Rounding bumped us to the next exponent, deal with it w /= 10; @@ -298,13 +300,19 @@ string flt_to_str(T v, const Fmt &f) } if(!showexp) { - ++digits; - ++point; + if(mode==Fmt::FIXED) + ++digits; + if(leading_zeroes) + --leading_zeroes; + else + ++point; } else ++exp; } + digits += leading_zeroes; + // Create a buffer and start from the end unsigned size = max(f.get_width(), digits+8); char *buf = new char[size]; @@ -326,14 +334,17 @@ string flt_to_str(T v, const Fmt &f) { if(i==point) *mptr++ = '.'; - if(showexp || static_cast(i)>=-exp) + if(!leading_zeroes) { int digit = static_cast(w); *mptr++ = '0'+digit; w = (w-digit)*10; } else + { *mptr++ = '0'; + --leading_zeroes; + } } if(f.get_showpoint()) @@ -378,7 +389,7 @@ T str_to_flt(const string &s, const Fmt &) if(s.empty()) throw lexical_error("conversion of '' to floating-point"); - std::string::const_iterator i = s.begin(); + string::const_iterator i = s.begin(); // See if the input starts with a sign bool neg = false; @@ -460,6 +471,7 @@ namespace Msp { void LexicalConverter::result(const string &s) { + filled = true; if(s.size()>(const LexicalConverter &c, char &v) v = str_to_int(c.get(), c.get_fmt()); else { - const std::string &s = c.get(); + const string &s = c.get(); if(s.empty()) throw lexical_error("conversion of '' to character"); if(s.size()>1)