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