Skip to content

Commit 97036e3

Browse files
authored
Merge pull request #256 from fastfloat/json-accept-empty-exponent
Allow JSON empty exponent as trailing junk
2 parents 129f0e8 + e6777f2 commit 97036e3

File tree

2 files changed

+38
-15
lines changed

2 files changed

+38
-15
lines changed

include/fast_float/ascii_number.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ parsed_number_string_t<UC> parse_number_string(UC const *p, UC const * pend, par
349349
++p;
350350
}
351351
if ((p == pend) || !is_integer(*p)) {
352-
if(!(fmt & chars_format::fixed) || (fmt & FASTFLOAT_JSONFMT)) {
352+
if(!(fmt & chars_format::fixed)) {
353353
// We are in error.
354354
return answer;
355355
}

tests/json_fmt.cpp

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,55 @@ int main_readme3() {
3636
return EXIT_SUCCESS;
3737
}
3838

39-
int main()
40-
{
41-
const std::vector<double> expected{ -0.2, 0.02, 0.002, 1., 0., std::numeric_limits<double>::infinity() };
42-
const std::vector<std::string> accept{ "-0.2", "0.02", "0.002", "1e+0000", "0e-2", "inf" };
43-
const std::vector<std::string> reject{"-.2", "00.02", "0.e+1", "00.e+1",
44-
"1e", "1e+", ".25", "+0.25",
45-
"inf", "nan(snan)"};
39+
struct ExpectedResult {
40+
double value;
41+
std::string junk_chars;
42+
};
43+
struct AcceptedValue {
44+
std::string input;
45+
ExpectedResult expected;
46+
};
47+
48+
int main() {
49+
const std::vector<AcceptedValue> accept{
50+
{"-0.2", {-0.2, ""}},
51+
{"0.02", {0.02, ""}},
52+
{"0.002", {0.002, ""}},
53+
{"1e+0000", {1., ""}},
54+
{"0e-2", {0., ""}},
55+
{"1e", {1., "e"}},
56+
{"1e+", {1., "e+"}},
57+
{"inf", {std::numeric_limits<double>::infinity(), ""}}};
58+
const std::vector<std::string> reject{"-.2", "00.02", "0.e+1", "00.e+1",
59+
".25", "+0.25", "inf", "nan(snan)"};
4660

4761
for (std::size_t i = 0; i < accept.size(); ++i)
4862
{
49-
const auto& f = accept[i];
63+
const auto& s = accept[i].input;
64+
const auto& expected = accept[i].expected;
5065
double result;
51-
auto answer = fast_float::from_chars(f.data(), f.data() + f.size(), result, fast_float::chars_format::json_or_infnan);
52-
if (answer.ec != std::errc() || result != expected[i]) {
53-
std::cerr << "json fmt rejected valid json " << f << std::endl;
66+
auto answer = fast_float::from_chars(s.data(), s.data() + s.size(), result, fast_float::chars_format::json_or_infnan);
67+
if (answer.ec != std::errc()) {
68+
std::cerr << "json fmt rejected valid json " << s << std::endl;
69+
return EXIT_FAILURE;
70+
}
71+
if (result != expected.value) {
72+
std::cerr << "json fmt gave wrong result " << s << " (expected " << expected.value << " got " << result << ")" << std::endl;
73+
return EXIT_FAILURE;
74+
}
75+
if (std::string(answer.ptr) != expected.junk_chars) {
76+
std::cerr << "json fmt has wrong trailing characters " << s << " (expected " << expected.junk_chars << " got " << answer.ptr << ")" << std::endl;
5477
return EXIT_FAILURE;
5578
}
5679
}
5780

5881
for (std::size_t i = 0; i < reject.size(); ++i)
5982
{
60-
const auto& f = reject[i];
83+
const auto& s = reject[i];
6184
double result;
62-
auto answer = fast_float::from_chars(f.data(), f.data() + f.size(), result, fast_float::chars_format::json);
85+
auto answer = fast_float::from_chars(s.data(), s.data() + s.size(), result, fast_float::chars_format::json);
6386
if (answer.ec == std::errc()) {
64-
std::cerr << "json fmt accepted invalid json " << f << std::endl;
87+
std::cerr << "json fmt accepted invalid json " << s << std::endl;
6588
return EXIT_FAILURE;
6689
}
6790
}

0 commit comments

Comments
 (0)