gnucash maint: Multiple changes pushed
John Ralls
jralls at code.gnucash.org
Sun Aug 25 18:56:06 EDT 2019
Updated via https://github.com/Gnucash/gnucash/commit/4de2e2b9 (commit)
via https://github.com/Gnucash/gnucash/commit/04aab7ce (commit)
from https://github.com/Gnucash/gnucash/commit/bdb85888 (commit)
commit 4de2e2b9c2d96332bb1d3b2228b9e8bab56bcae6
Merge: bdb858883 04aab7cea
Author: John Ralls <jralls at ceridwen.us>
Date: Sun Aug 25 15:55:36 2019 -0700
Merge Craig Mason-Jones's 'gncnumeric-neg-string' into maint.
commit 04aab7cea3bc8ea47931dde98611668980ec4f65
Author: Craig <craig at lateral.co.za>
Date: Sat Aug 24 05:45:31 2019 +0200
Correctly parse decimals between 0 and -1.
The negative sign was being lost because stoll("-0") is 0.
Also permits parsing decimals between -1 and 1 without the leading 0.
diff --git a/libgnucash/engine/gnc-numeric.cpp b/libgnucash/engine/gnc-numeric.cpp
index a2cbf6d1c..4e4250fdb 100644
--- a/libgnucash/engine/gnc-numeric.cpp
+++ b/libgnucash/engine/gnc-numeric.cpp
@@ -120,7 +120,7 @@ using boost::smatch;
using boost::regex_search;
GncNumeric::GncNumeric(const std::string& str, bool autoround)
{
- static const std::string numer_frag("(-?[0-9]+)");
+ static const std::string numer_frag("(-?[0-9]*)");
static const std::string denom_frag("([0-9]+)");
static const std::string hex_frag("(0x[a-f0-9]+)");
static const std::string slash( "[ \\t]*/[ \\t]*");
@@ -175,10 +175,13 @@ GncNumeric::GncNumeric(const std::string& str, bool autoround)
}
if (regex_search(str, m, decimal))
{
- GncInt128 high(stoll(m[1].str()));
+ auto neg = (m[1].length() && m[1].str()[0] == '-');
+ GncInt128 high((neg && m[1].length() > 1) || (!neg && m[1].length()) ?
+ stoll(m[1].str()) : 0);
GncInt128 low(stoll(m[2].str()));
int64_t d = powten(m[2].str().length());
- GncInt128 n = high * d + (high >= 0 ? low : -low);
+ GncInt128 n = high * d + (neg ? -low : low);
+
if (!autoround && n.isBig())
{
std::ostringstream errmsg;
diff --git a/libgnucash/engine/test/gtest-gnc-numeric.cpp b/libgnucash/engine/test/gtest-gnc-numeric.cpp
index 680b6d82d..5cbe5c724 100644
--- a/libgnucash/engine/test/gtest-gnc-numeric.cpp
+++ b/libgnucash/engine/test/gtest-gnc-numeric.cpp
@@ -179,6 +179,12 @@ TEST(gncnumeric_constructors, test_string_constructor)
std::out_of_range);
EXPECT_THROW(GncNumeric bad_string("Four score and seven"),
std::invalid_argument);
+ GncNumeric neg_decimal_frac("-0.12345");
+ EXPECT_EQ(-12345, neg_decimal_frac.num());
+ EXPECT_EQ(100000, neg_decimal_frac.denom());
+ GncNumeric neg_decimal_frac_nozero("-.12345");
+ EXPECT_EQ(-12345, neg_decimal_frac_nozero.num());
+ EXPECT_EQ(100000, neg_decimal_frac_nozero.denom());
}
TEST(gncnumeric_output, string_output)
Summary of changes:
libgnucash/engine/gnc-numeric.cpp | 9 ++++++---
libgnucash/engine/test/gtest-gnc-numeric.cpp | 6 ++++++
2 files changed, 12 insertions(+), 3 deletions(-)
More information about the gnucash-changes
mailing list