aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2021-02-12 09:44:12 +0100
committerJay Berkenbilt <ejb@ql.org>2021-02-13 08:30:00 +0100
commit07f40bd25442f25c0af948ae1b0dac7fdff1688c (patch)
tree3fca13d92b02bc3712d98c3c43f9612ae4c56cf1 /libqpdf
parent8fbc8579f2481dc3eeb962e99522047291e16fbe (diff)
downloadqpdf-07f40bd25442f25c0af948ae1b0dac7fdff1688c.tar.zst
QUtil::double_to_string: trim trailing zeroes with option to disable
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDFObjectHandle.cc11
-rw-r--r--libqpdf/QPDF_Real.cc5
-rw-r--r--libqpdf/QUtil.cc25
-rw-r--r--libqpdf/qpdf/QPDF_Real.hh2
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();