diff options
author | Jay Berkenbilt <ejb@ql.org> | 2021-02-12 09:44:12 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2021-02-13 08:30:00 +0100 |
commit | 07f40bd25442f25c0af948ae1b0dac7fdff1688c (patch) | |
tree | 3fca13d92b02bc3712d98c3c43f9612ae4c56cf1 /libqpdf | |
parent | 8fbc8579f2481dc3eeb962e99522047291e16fbe (diff) | |
download | qpdf-07f40bd25442f25c0af948ae1b0dac7fdff1688c.tar.zst |
QUtil::double_to_string: trim trailing zeroes with option to disable
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/QPDFObjectHandle.cc | 11 | ||||
-rw-r--r-- | libqpdf/QPDF_Real.cc | 5 | ||||
-rw-r--r-- | libqpdf/QUtil.cc | 25 | ||||
-rw-r--r-- | libqpdf/qpdf/QPDF_Real.hh | 2 |
4 files changed, 36 insertions, 7 deletions
diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 15907f6e..94875e13 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -2422,7 +2422,16 @@ QPDFObjectHandle::newReal(std::string const& value) QPDFObjectHandle QPDFObjectHandle::newReal(double value, int decimal_places) { - return QPDFObjectHandle(new QPDF_Real(value, decimal_places)); + return QPDFObjectHandle( + new QPDF_Real(value, decimal_places, true)); +} + +QPDFObjectHandle +QPDFObjectHandle::newReal(double value, int decimal_places, + bool trim_trailing_zeroes) +{ + return QPDFObjectHandle( + new QPDF_Real(value, decimal_places, trim_trailing_zeroes)); } QPDFObjectHandle diff --git a/libqpdf/QPDF_Real.cc b/libqpdf/QPDF_Real.cc index 396ea25f..55f61b35 100644 --- a/libqpdf/QPDF_Real.cc +++ b/libqpdf/QPDF_Real.cc @@ -7,8 +7,9 @@ QPDF_Real::QPDF_Real(std::string const& val) : { } -QPDF_Real::QPDF_Real(double value, int decimal_places) : - val(QUtil::double_to_string(value, decimal_places)) +QPDF_Real::QPDF_Real(double value, int decimal_places, + bool trim_trailing_zeroes) : + val(QUtil::double_to_string(value, decimal_places, trim_trailing_zeroes)) { } diff --git a/libqpdf/QUtil.cc b/libqpdf/QUtil.cc index 4b86c0d4..a3fa94f4 100644 --- a/libqpdf/QUtil.cc +++ b/libqpdf/QUtil.cc @@ -324,10 +324,17 @@ QUtil::uint_to_string_base(unsigned long long num, int base, int length) std::string QUtil::double_to_string(double num, int decimal_places) { + return double_to_string(num, decimal_places, true); +} + +std::string +QUtil::double_to_string(double num, int decimal_places, + bool trim_trailing_zeroes) +{ // Backward compatibility -- this code used to use sprintf and // treated decimal_places <= 0 to mean to use the default, which - // was six decimal places. Also sprintf with %*.f interprets the - // length as fixed point rather than significant figures. + // was six decimal places. Starting in 10.2, we trim trailing + // zeroes by default. if (decimal_places <= 0) { decimal_places = 6; @@ -335,7 +342,19 @@ QUtil::double_to_string(double num, int decimal_places) std::ostringstream buf; buf.imbue(std::locale::classic()); buf << std::setprecision(decimal_places) << std::fixed << num; - return buf.str(); + std::string result = buf.str(); + if (trim_trailing_zeroes) + { + while ((result.length() > 1) && (result.back() == '0')) + { + result.pop_back(); + } + if ((result.length() > 1) && (result.back() == '.')) + { + result.pop_back(); + } + } + return result; } long long diff --git a/libqpdf/qpdf/QPDF_Real.hh b/libqpdf/qpdf/QPDF_Real.hh index dbc03de6..793990c0 100644 --- a/libqpdf/qpdf/QPDF_Real.hh +++ b/libqpdf/qpdf/QPDF_Real.hh @@ -7,7 +7,7 @@ class QPDF_Real: public QPDFObject { public: QPDF_Real(std::string const& val); - QPDF_Real(double value, int decimal_places = 0); + QPDF_Real(double value, int decimal_places, bool trim_trailing_zeroes); virtual ~QPDF_Real(); virtual std::string unparse(); virtual JSON getJSON(); |