124 std::size_t size = cell.size();
125 if (
auto end_pos = cell.find_last_not_of(
" \t"); end_pos != std::string_view::npos) {
128 std::string s(cell.data(), size);
131 std::transform(s.begin(), s.end(), s.begin(), [](
unsigned char c) {
132 return static_cast<char>(std::tolower(c));
135 std::optional<Number> numeric_value;
140 std::size_t num_processed = 0;
144 if constexpr(std::is_same_v<Number, float>) {
145 parsed_value = std::stof(s, &num_processed);
146 }
else if constexpr(std::is_same_v<Number, double>) {
147 parsed_value = std::stod(s, &num_processed);
148 }
else if constexpr(std::is_same_v<Number, long double>) {
149 parsed_value = std::stold(s, &num_processed);
151 }
else if constexpr(std::is_same_v<Number, int>) {
152 parsed_value = std::stoi(s, &num_processed);
153 }
else if constexpr(std::is_same_v<Number, long int>) {
154 parsed_value = std::stol(s, &num_processed);
155 }
else if constexpr(std::is_same_v<Number, long long int>) {
156 parsed_value = std::stoll(s, &num_processed);
158 }
else if constexpr(std::is_same_v<Number, unsigned long int>) {
159 parsed_value = std::stoul(s, &num_processed);
160 }
else if constexpr(std::is_same_v<Number, unsigned long long int>) {
161 parsed_value = std::stoull(s, &num_processed);
164 static_assert(internal::always_false<Number>::value,
"Invalid Number type in Csv::readNumber()");
167 if (num_processed == s.size()) {
168 numeric_value = parsed_value;
173 return numeric_value;
185 cell.remove_prefix(std::min(cell.find_first_not_of(
" \t"), cell.size()));
186 cell.remove_suffix(std::min(cell.size() - cell.find_last_not_of(
" \t") - 1, cell.size()));
192 std::transform(s.begin(), s.end(), s.begin(), [](
unsigned char c) {
193 return (c >=
'A' && c <=
'Z') ? c + (
'a' -
'A') : c;
196 Number parsed_value = 0;
199 auto [ptr, ec] = std::from_chars(s.data(), s.data() + s.size(), parsed_value);
200 if (ec == std::errc() && ptr == (s.data() + s.size())) {
std::optional< Number > readNumberLocale(std::string_view cell)
Try to read a numeric value from string data.
Definition csv_util.h:121
std::optional< Number > readNumberNoLocale(std::string_view cell)
Try to read a numeric value from string data.
Definition csv_util.h:182
constexpr std::size_t getCleanStringSize(std::string_view uncollapsed_view)
Get size of a cleaned-up string given the uncollapsed string.
Definition csv_util.h:104