commit 8b86af72980779f64e8beb9353693169c2b95ef2
Author: Juergen Spitzmueller <[email protected]>
Date: Wed May 20 09:35:57 2015 +0200
Fix LaTeX length export of big numbers, part 2 (bug #9416)
LaTeX lengths must not use scientific notation, since the + sign has a
different meaning (glue lengths). This is the GUI part of bug 9416,
on top of part 1 [59e4d16ab/lyxgit].
diff --git a/src/Length.cpp b/src/Length.cpp
index 89061e1..ec89e5b 100644
--- a/src/Length.cpp
+++ b/src/Length.cpp
@@ -28,6 +28,7 @@
#include <iomanip>
using namespace std;
+using namespace lyx::support;
namespace lyx {
@@ -65,7 +66,7 @@ string const Length::asString() const
{
ostringstream os;
if (unit_ != UNIT_NONE)
- os << val_ << unit_name[unit_]; // setw?
+ os << formatFPNumber(val_) << unit_name[unit_]; // setw?
return os.str();
}
@@ -74,7 +75,7 @@ docstring const Length::asDocstring() const
{
odocstringstream os;
if (unit_ != UNIT_NONE)
- os << val_ << unit_name[unit_]; // setw?
+ os << formatFPNumber(val_) << unit_name[unit_]; // setw?
return os.str();
}
@@ -86,27 +87,27 @@ string const Length::asLatexString() const
// LaTeX (bug 9416)
switch (unit_) {
case PTW:
- os << support::formatFPNumber(val_ / 100.0) << "\\textwidth";
+ os << formatFPNumber(val_ / 100.0) << "\\textwidth";
break;
case PCW:
- os << support::formatFPNumber(val_ / 100.0) << "\\columnwidth";
+ os << formatFPNumber(val_ / 100.0) << "\\columnwidth";
break;
case PPW:
- os << support::formatFPNumber(val_ / 100.0) << "\\paperwidth";
+ os << formatFPNumber(val_ / 100.0) << "\\paperwidth";
break;
case PLW:
- os << support::formatFPNumber(val_ / 100.0) << "\\linewidth";
+ os << formatFPNumber(val_ / 100.0) << "\\linewidth";
break;
case PTH:
- os << support::formatFPNumber(val_ / 100.0) << "\\textheight";
+ os << formatFPNumber(val_ / 100.0) << "\\textheight";
break;
case PPH:
- os << support::formatFPNumber(val_ / 100.0) << "\\paperheight";
+ os << formatFPNumber(val_ / 100.0) << "\\paperheight";
break;
case UNIT_NONE:
break;
default:
- os << support::formatFPNumber(val_) << unit_name[unit_];
+ os << formatFPNumber(val_) << unit_name[unit_];
break;
}
return os.str();
@@ -121,7 +122,7 @@ string const Length::asHTMLString() const
case BP:
case DD:
// close enough
- os << val_ << "pt";
+ os << formatFPNumber(val_) << "pt";
break;
case MM:
case CM:
@@ -129,13 +130,13 @@ string const Length::asHTMLString() const
case IN:
case EX:
case EM:
- os << val_ << unit_name[unit_];
+ os << formatFPNumber(val_) << unit_name[unit_];
break;
case CC:
- os << val_/12.0 << "pt";
+ os << formatFPNumber(val_ / 12.0) << "pt";
break;
case MU:
- os << val_/18.0 << "em";
+ os << formatFPNumber(val_ / 18.0) << "em";
break;
case PTW:
case PPW:
@@ -145,7 +146,7 @@ string const Length::asHTMLString() const
case PPH:
// what it's a percentage of probably won't make sense for HTML,
// so we'll assume people have chosen these appropriately
- os << val_ << '%';
+ os << formatFPNumber(val_) << '%';
break;
case SP:
case UNIT_NONE:
@@ -377,7 +378,7 @@ string const GlueLength::asString() const
ostringstream buffer;
- buffer << len_.value();
+ buffer << formatFPNumber(len_.value());
if (plus_.zero() && minus_.zero()) {
buffer << unit_name[len_.unit()];
@@ -388,7 +389,7 @@ string const GlueLength::asString() const
if (minus_.zero()) {
if (len_.unit() != plus_.unit())
buffer << unit_name[len_.unit()];
- buffer << '+' << plus_.value();
+ buffer << '+' << formatFPNumber(plus_.value());
buffer << unit_name[plus_.unit()];
return buffer.str();
}
@@ -397,7 +398,7 @@ string const GlueLength::asString() const
if (plus_.zero()) {
if (len_.unit() != minus_.unit())
buffer << unit_name[len_.unit()];
- buffer << '-' << minus_.value();
+ buffer << '-' << formatFPNumber(minus_.value());
buffer << unit_name[minus_.unit()];
return buffer.str();
}
@@ -408,7 +409,7 @@ string const GlueLength::asString() const
if (minus_ == plus_) {
if (len_.unit() != minus_.unit())
buffer << unit_name[len_.unit()];
- buffer << "+-" << minus_.value();
+ buffer << "+-" << formatFPNumber(minus_.value());
buffer << unit_name[minus_.unit()];
return buffer.str();
}
@@ -416,8 +417,8 @@ string const GlueLength::asString() const
// this is so rare a case, why bother minimising units ?
buffer << unit_name[len_.unit()];
- buffer << '+' << plus_.value() << unit_name[plus_.unit()];
- buffer << '-' << minus_.value() << unit_name[minus_.unit()];
+ buffer << '+' << formatFPNumber(plus_.value()) <<
unit_name[plus_.unit()];
+ buffer << '-' << formatFPNumber(minus_.value()) <<
unit_name[minus_.unit()];
return buffer.str();
}
diff --git a/src/frontends/qt4/qt_helpers.cpp b/src/frontends/qt4/qt_helpers.cpp
index eb495f5..a395abf 100644
--- a/src/frontends/qt4/qt_helpers.cpp
+++ b/src/frontends/qt4/qt_helpers.cpp
@@ -145,7 +145,7 @@ void lengthToWidgets(QLineEdit * input, LengthCombo * combo,
combo->setCurrentItem(len.unit());
QLocale loc;
loc.setNumberOptions(QLocale::OmitGroupSeparator);
- input->setText(loc.toString(Length(len).value()));
+ input->setText(formatLocFPNumber(Length(len).value()));
}
}
@@ -204,6 +204,15 @@ void doubleToWidget(QLineEdit * input, string const &
value, char f, int prec)
}
+QString formatLocFPNumber(double d)
+{
+ QString result = toqstr(formatFPNumber(d));
+ QLocale loc;
+ result.replace('.', loc.decimalPoint());
+ return result;
+}
+
+
void setValid(QWidget * widget, bool valid)
{
if (valid) {
diff --git a/src/frontends/qt4/qt_helpers.h b/src/frontends/qt4/qt_helpers.h
index defd1a8..fcdcd53 100644
--- a/src/frontends/qt4/qt_helpers.h
+++ b/src/frontends/qt4/qt_helpers.h
@@ -67,6 +67,11 @@ void doubleToWidget(QLineEdit * input, double const & value,
/// method to set a (localized) double value in a widget (QLineEdit)
void doubleToWidget(QLineEdit * input, std::string const & value,
char f = 'g', int prec = 6);
+/**
+ * method to format localized floating point numbers without
+ * ever using scientific notation
+ */
+QString formatLocFPNumber(double d);
/// colors a widget red if invalid
void setValid(QWidget * widget, bool valid);