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 {