mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2026-02-08 02:36:49 +08:00
Handle negative numbers in parse_num
- fix issue #334, where negative numbers loaded from JSON were being parsed as 0. - add unit tests to cover these cases.
This commit is contained in:
parent
244b5b224b
commit
db80a5f4bf
@ -145,14 +145,18 @@ namespace chaiscript {
|
|||||||
auto parse_num(const char *t_str) -> typename std::enable_if<std::is_integral<T>::value, T>::type
|
auto parse_num(const char *t_str) -> typename std::enable_if<std::is_integral<T>::value, T>::type
|
||||||
{
|
{
|
||||||
T t = 0;
|
T t = 0;
|
||||||
|
bool is_negative = false;
|
||||||
for (char c = *t_str; (c = *t_str) != 0; ++t_str) {
|
for (char c = *t_str; (c = *t_str) != 0; ++t_str) {
|
||||||
if (c < '0' || c > '9') {
|
if (c == '-') {
|
||||||
return t;
|
is_negative = true;
|
||||||
}
|
} else if (c < '0' || c > '9') {
|
||||||
|
return is_negative ? -t : t;
|
||||||
|
} else {
|
||||||
t *= 10;
|
t *= 10;
|
||||||
t += c - '0';
|
t += c - '0';
|
||||||
}
|
}
|
||||||
return t;
|
}
|
||||||
|
return is_negative ? -t : t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -164,12 +168,13 @@ namespace chaiscript {
|
|||||||
T decimal_place = 0;
|
T decimal_place = 0;
|
||||||
bool exponent = false;
|
bool exponent = false;
|
||||||
bool neg_exponent = false;
|
bool neg_exponent = false;
|
||||||
|
bool is_negative = false;
|
||||||
|
|
||||||
const auto final_value = [](const T val, const T baseval, const bool hasexp, const bool negexp) -> T {
|
const auto final_value = [](const T val, const bool neg, const T baseval, const bool hasexp, const bool negexp) -> T {
|
||||||
if (!hasexp) {
|
if (!hasexp) {
|
||||||
return val;
|
return neg ? -val : val;
|
||||||
} else {
|
} else {
|
||||||
return baseval * std::pow(T(10), val*T(negexp?-1:1));
|
return (T(neg?-1:1)) * baseval * std::pow(T(10), val*T(negexp?-1:1));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -182,12 +187,16 @@ namespace chaiscript {
|
|||||||
decimal_place = 0;
|
decimal_place = 0;
|
||||||
base = t;
|
base = t;
|
||||||
t = 0;
|
t = 0;
|
||||||
} else if (c == '-' && exponent) {
|
} else if (c == '-') {
|
||||||
|
if (exponent) {
|
||||||
neg_exponent = true;
|
neg_exponent = true;
|
||||||
|
} else {
|
||||||
|
is_negative = true;
|
||||||
|
}
|
||||||
} else if (c == '+' && exponent) {
|
} else if (c == '+' && exponent) {
|
||||||
neg_exponent = false;
|
neg_exponent = false;
|
||||||
} else if (c < '0' || c > '9') {
|
} else if (c < '0' || c > '9') {
|
||||||
return final_value(t, base, exponent, neg_exponent);
|
return final_value(t, is_negative, base, exponent, neg_exponent);
|
||||||
} else if (decimal_place < T(10)) {
|
} else if (decimal_place < T(10)) {
|
||||||
t *= T(10);
|
t *= T(10);
|
||||||
t += T(c - '0');
|
t += T(c - '0');
|
||||||
@ -197,7 +206,7 @@ namespace chaiscript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return final_value(t, base, exponent, neg_exponent);
|
return final_value(t, is_negative, base, exponent, neg_exponent);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
|||||||
@ -1 +1,2 @@
|
|||||||
assert_equal(from_json("100"), 100)
|
assert_equal(from_json("100"), 100)
|
||||||
|
assert_equal(from_json("-100"), -100)
|
||||||
|
|||||||
@ -1 +1,2 @@
|
|||||||
assert_equal(from_json("1.234"), 1.234)
|
assert_equal(from_json("1.234"), 1.234)
|
||||||
|
assert_equal(from_json("-1.234"), -1.234)
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
assert_equal(from_json("[1,2,3]"), [1,2,3])
|
assert_equal(from_json("[1,-2,3]"), [1,-2,3])
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user