]> git.lyx.org Git - lyx.git/blobdiff - src/support/lstrings.cpp
Fix bugs #6078 and #9364
[lyx.git] / src / support / lstrings.cpp
index ea1ba59984a62ba7e92910d94530a930e3baf0ef..5e68b755d06868cd0657736789a63d0e81a10de0 100644 (file)
 
 #include <QString>
 
+#include <cmath>
 #include <cstdio>
 #include <cstring>
 #include <algorithm>
+#include <iomanip>
+#include <sstream>
 #include <typeinfo>
 
 using namespace std;
@@ -1071,18 +1074,20 @@ String const doSplit(String const & a, String & piece, Char delim)
        size_t i = a.find(delim);
        if (i == a.length() - 1) {
                piece = a.substr(0, i);
-       } else if (i != String::npos) {
-               piece = a.substr(0, i);
-               tmp = a.substr(i + 1);
        } else if (i == 0) {
                piece.erase();
                tmp = a.substr(i + 1);
+       } else if (i != String::npos) {
+               piece = a.substr(0, i);
+               tmp = a.substr(i + 1);
        } else {
                piece = a;
        }
        return tmp;
 }
 
+
+// FIXME: why is this specialization needed?
 template<typename Char> inline
 docstring const doSplit(docstring const & a, docstring & piece, Char delim)
 {
@@ -1090,12 +1095,12 @@ docstring const doSplit(docstring const & a, docstring & piece, Char delim)
        size_t i = a.find(delim);
        if (i == a.length() - 1) {
                piece = a.substr(0, i);
-       } else if (i != docstring::npos) {
-               piece = a.substr(0, i);
-               tmp = a.substr(i + 1);
        } else if (i == 0) {
                piece.erase();
                tmp = a.substr(i + 1);
+       } else if (i != docstring::npos) {
+               piece = a.substr(0, i);
+               tmp = a.substr(i + 1);
        } else {
                piece = a;
        }
@@ -1385,6 +1390,37 @@ int findToken(char const * const str[], string const & search_token)
 }
 
 
+#ifdef _MSC_VER
+// Replacement for C99 function lround()
+double round(double x)
+{
+       if (x < 0)
+               return ceil(x - 0.5);
+       else
+               return floor(x + 0.5);
+}
+#endif
+
+
+std::string formatFPNumber(double x)
+{
+       // Need manual tweaking, QString::number(x, 'f', 16) does not work either
+       ostringstream os;
+       os << std::fixed;
+       // Prevent outputs of 23.4200000000000017 but output small numbers
+       // with at least 6 significant digits.
+       double const logarithm = log10(fabs(x));
+       os << std::setprecision(max(6 - static_cast<int>(round(logarithm)), 0)) << x;
+       string result = os.str();
+       if (result.find('.') != string::npos) {
+               result = rtrim(result, "0");
+               if (result[result.length()-1] == '.')
+                       result = rtrim(result, ".");
+       }
+       return result;
+}
+
+
 template<>
 docstring bformat(docstring const & fmt, int arg1)
 {