Skip to content

Commit

Permalink
Correctly copy the null terminator
Browse files Browse the repository at this point in the history
Fixes #714
  • Loading branch information
m7913d committed Sep 23, 2023
1 parent 297b331 commit 33dd551
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 1 deletion.
3 changes: 2 additions & 1 deletion include/xlnt/utils/numeric.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,8 @@ class number_serialiser
}
char buf[30];
assert(s.size() < sizeof(buf));
auto copy_end = std::copy(s.begin(), s.end(), buf);
const char *cstr = s.c_str();
auto copy_end = std::copy(cstr, cstr + s.size() + 1, buf);
convert_pt_to_comma(buf, static_cast<size_t>(copy_end - buf));
double d = strtod(buf, &end_of_convert);
*len_converted = end_of_convert - buf;
Expand Down
Binary file added tests/data/Issue714_local_comma.xlsx
Binary file not shown.
15 changes: 15 additions & 0 deletions tests/detail/numeric_util_test_suite.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

#include <xlnt/utils/numeric.hpp>
#include <helpers/test_suite.hpp>
#include <cstring>

class numeric_test_suite : public test_suite
{
Expand All @@ -36,6 +37,7 @@ class numeric_test_suite : public test_suite
register_test(test_min);
register_test(test_max);
register_test(test_abs);
register_test(test_locale_comma);
}

void test_serialise_number()
Expand Down Expand Up @@ -219,5 +221,18 @@ class numeric_test_suite : public test_suite

static_assert(xlnt::detail::abs(-1.23) == 1.23, "constexpr");
}

void test_locale_comma ()
{
struct SetLocale
{
SetLocale() {xlnt_assert(setlocale(LC_ALL, "de_DE") != nullptr);} // If failed, please install de_DE locale to correctly run this test.
~SetLocale() {setlocale(LC_ALL, "C");}
} setLocale;

xlnt::detail::number_serialiser serialiser;
xlnt_assert(serialiser.deserialise("1.99999999") == 1.99999999);
xlnt_assert(serialiser.deserialise("1.1") == 1.1);
}
};
static numeric_test_suite x;
16 changes: 16 additions & 0 deletions tests/workbook/serialization_test_suite.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ class serialization_test_suite : public test_suite
register_test(test_Issue503_external_link_load);
register_test(test_formatting);
register_test(test_active_sheet);
register_test(test_locale_comma);
}

bool workbook_matches_file(xlnt::workbook &wb, const xlnt::path &file)
Expand Down Expand Up @@ -808,6 +809,21 @@ class serialization_test_suite : public test_suite
wb.load(path_helper::test_file("20_active_sheet.xlsx"));
xlnt_assert_equals(wb.active_sheet(), wb[2]);
}

void test_locale_comma ()
{
struct SetLocale
{
SetLocale() {xlnt_assert(setlocale(LC_ALL, "de_DE") != nullptr);} // If failed, please install de_DE locale to correctly run this test.
~SetLocale() {setlocale(LC_ALL, "C");}
} setLocale;

xlnt::workbook wb;
wb.load(path_helper::test_file("Issue714_local_comma.xlsx"));
auto ws = wb.active_sheet();
xlnt_assert_equals(ws.cell("A1").value<double>(), 1.9999999999);
xlnt_assert_equals(ws.cell("A2").value<double>(), 1.1);
}
};

static serialization_test_suite x;

0 comments on commit 33dd551

Please sign in to comment.