From 0d125b15346481817bbf3b17eff8578a5d04636b Mon Sep 17 00:00:00 2001 From: Thomas Fussell Date: Fri, 8 Sep 2017 20:10:46 -0400 Subject: [PATCH] encapsulate stateful stringstream string to float conversion into a separate struct --- source/detail/serialization/xlsx_consumer.cpp | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/source/detail/serialization/xlsx_consumer.cpp b/source/detail/serialization/xlsx_consumer.cpp index 42a450e0..291dee55 100644 --- a/source/detail/serialization/xlsx_consumer.cpp +++ b/source/detail/serialization/xlsx_consumer.cpp @@ -23,6 +23,7 @@ #include #include // for std::accumulate +#include #include #include @@ -102,6 +103,25 @@ bool is_true(const std::string &bool_string) #endif } +struct number_converter +{ + number_converter() + { + stream.imbue(std::locale("C")); + } + + long double stold(const std::string &s) + { + stream.str(s); + stream.clear(); + stream >> result; + return result; + }; + + std::istringstream stream; + long double result; +}; + } // namespace /* @@ -251,16 +271,7 @@ cell xlsx_consumer::read_cell() cell.formula(formula_value_string); } - std::istringstream number_converter; - number_converter.imbue(std::locale("C")); - - auto stold = [&number_converter](const std::string &s) - { - number_converter.str(s); - long double result; - number_converter >> result; - return result; - }; + number_converter converter; if (has_value) { @@ -276,7 +287,7 @@ cell xlsx_consumer::read_cell() } else if (type == "s") { - cell.d_->value_numeric_ = stold(value_string); + cell.d_->value_numeric_ = converter.stold(value_string); cell.data_type(cell::type::shared_string); } else if (type == "b") // boolean @@ -285,7 +296,7 @@ cell xlsx_consumer::read_cell() } else if (type == "n") // numeric { - cell.value(stold(value_string)); + cell.value(converter.stold(value_string)); } else if (!value_string.empty() && value_string[0] == '#') { @@ -553,16 +564,7 @@ void xlsx_consumer::read_worksheet_sheetdata() return; } - std::istringstream number_converter; - number_converter.imbue(std::locale("C")); - - auto stold = [&number_converter](const std::string &s) - { - number_converter.str(s); - long double result; - number_converter >> result; - return result; - }; + number_converter converter; while (in_element(qn("spreadsheetml", "sheetData"))) { @@ -665,7 +667,7 @@ void xlsx_consumer::read_worksheet_sheetdata() } else if (type == "s") { - cell.d_->value_numeric_ = stold(value_string); + cell.d_->value_numeric_ = converter.stold(value_string); cell.data_type(cell::type::shared_string); } else if (type == "b") // boolean @@ -674,7 +676,7 @@ void xlsx_consumer::read_worksheet_sheetdata() } else if (type == "n") // numeric { - cell.value(stold(value_string)); + cell.value(converter.stold(value_string)); } else if (!value_string.empty() && value_string[0] == '#') {