]> git.tdb.fi Git - libs/core.git/blobdiff - source/strings/lexicalcast.cpp
Remove unnecessary std:: qualifiers
[libs/core.git] / source / strings / lexicalcast.cpp
index 6a226e1d27ac5ff356589c4e59f06c65085ebde4..8789544bbb355f14f421ccd9a6ea5f761a25e256 100644 (file)
@@ -108,12 +108,12 @@ string int_to_str(T v, const Fmt &f)
 }
 
 template<typename T>
-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<w)
+               while(div*10<=w)
                {
                        ++exp;
                        div *= 10;
@@ -257,6 +257,7 @@ string flt_to_str(T v, const Fmt &f)
 
        // Decide how to format the number
        unsigned digits;
+       unsigned leading_zeroes = 0;
        unsigned point = 1;
        bool showexp = false;
        if(mode==Fmt::FIXED)
@@ -279,15 +280,16 @@ string flt_to_str(T v, const Fmt &f)
                }
                else
                {
-                       point = max(exp, 0)+1;
                        if(exp<0)
-                               digits += -exp;
+                               leading_zeroes = -exp;
+                       else
+                               point = exp+1;
                }
        }
 
        // Apply rounding
        w += 5.0l/pow(10.0l, static_cast<long double>(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<int>(i)>=-exp)
+               if(!leading_zeroes)
                {
                        int digit = static_cast<int>(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()<fmt.get_width())
        {
                if(fmt.get_align()==Fmt::RIGHT)
@@ -471,6 +483,13 @@ void LexicalConverter::result(const string &s)
                buf = s;
 }
 
+const string &LexicalConverter::get() const
+{
+       if(!filled)
+               throw lexical_error("conversion not performed");
+       return buf;
+}
+
 
 /*** operator<< ***/
 
@@ -545,7 +564,7 @@ void operator>>(const LexicalConverter &c, char &v)
                v = str_to_int<char>(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)