From 8b1a0c05f520cbc26fc986820344fb8a3dcf598b Mon Sep 17 00:00:00 2001 From: guoxu <13910754971@163.com> Date: Tue, 16 Dec 2025 12:02:19 +0800 Subject: [PATCH] [fix][libexpr] Fix issue about string to decimal. --- src/types/decimal/decimal.cc | 12 ++++++++++-- src/types/decimal/decimal_p.h | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/types/decimal/decimal.cc b/src/types/decimal/decimal.cc index b3c8060..b649be0 100644 --- a/src/types/decimal/decimal.cc +++ b/src/types/decimal/decimal.cc @@ -31,12 +31,20 @@ namespace types { Decimal::Decimal(const std::string & var) { try { int i = 0; + bool followingE = false; + for (; i < var.length(); i++) { - if (var[i] != '.' && var[i] != 'e' && var[i] != 'E' + if (var[i] == 'e' || var[i] == 'E') { + followingE = true; + } + if ((var[i] == '-' || var[i] == '+') && i != 0 && !followingE) { + followingE = false; + break; + } else if (var[i] != '.' && var[i] != 'e' && var[i] != 'E' && var[i] != '-' && var[i] != '+' && (var[i] < 0x30 || var[i] > 0x39)) { break; - } + } } if (i == 0) { diff --git a/src/types/decimal/decimal_p.h b/src/types/decimal/decimal_p.h index 9e6e935..d0eee1b 100644 --- a/src/types/decimal/decimal_p.h +++ b/src/types/decimal/decimal_p.h @@ -88,7 +88,7 @@ class DecimalP { } DecimalP operator-() const { - return -(*m_ptr); + return Decimal("0") - (*m_ptr); } bool operator==(const DecimalP &v) const {