Skip to content

Commit

Permalink
Allow trailing spaces on strings for conversions to floating point an…
Browse files Browse the repository at this point in the history
…d integers
  • Loading branch information
phlptp committed Jan 13, 2025
1 parent 10ac3e5 commit 797e177
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
18 changes: 17 additions & 1 deletion include/CLI/TypeTools.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -968,6 +968,10 @@ bool integral_conversion(const std::string &input, T &output) noexcept {
nstring.erase(std::remove(nstring.begin(), nstring.end(), '\''), nstring.end());
return integral_conversion(nstring, output);
}
if (std::isspace(static_cast<unsigned char>(input.back())))
{
return integral_conversion(trim_copy(input),output);
}
if(input.compare(0, 2, "0o") == 0 || input.compare(0, 2, "0O") == 0) {
val = nullptr;
errno = 0;
Expand Down Expand Up @@ -1016,13 +1020,17 @@ bool integral_conversion(const std::string &input, T &output) noexcept {
output = static_cast<T>(1);
return true;
}
// remove separators
// remove separators and trailing spaces
if(input.find_first_of("_'") != std::string::npos) {
std::string nstring = input;
nstring.erase(std::remove(nstring.begin(), nstring.end(), '_'), nstring.end());
nstring.erase(std::remove(nstring.begin(), nstring.end(), '\''), nstring.end());
return integral_conversion(nstring, output);
}
if (std::isspace(static_cast<unsigned char>(input.back())))
{
return integral_conversion(trim_copy(input),output);
}
if(input.compare(0, 2, "0o") == 0 || input.compare(0, 2, "0O") == 0) {
val = nullptr;
errno = 0;
Expand Down Expand Up @@ -1147,6 +1155,14 @@ bool lexical_cast(const std::string &input, T &output) {
if(val == (input.c_str() + input.size())) {
return true;
}
while (std::isspace(static_cast<unsigned char>(*val)))
{
++val;
if(val == (input.c_str() + input.size())) {
return true;
}
}

// remove separators
if(input.find_first_of("_'") != std::string::npos) {
std::string nstring = input;
Expand Down
6 changes: 6 additions & 0 deletions tests/OptionTypeTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,9 +227,13 @@ TEST_CASE_METHOD(TApp, "atomic_int_option", "[optiontype]") {
static const std::map<std::string, double> testValuesDouble{
{"3.14159", 3.14159},
{"-3.14159", -3.14159},
{"-3.14159\t", -3.14159},
{"-3.14159 ", -3.14159},
{"+1.0", 1.0},
{"-0.01", -0.01},
{"5e22", 5e22},
{" 5e22", 5e22},
{" 5e22 ", 5e22},
{"-2E-2", -2e-2},
{"5e+22", 5e22},
{"1e06", 1e6},
Expand Down Expand Up @@ -268,6 +272,7 @@ static const std::map<std::string, std::int64_t> testValuesInt{
{"+99", 99},
{"99", 99},
{"-99", -99},
{"-99 ", -99},
{"0xDEADBEEF", 0xDEADBEEF},
{"0xdeadbeef", 0xDEADBEEF},
{"0XDEADBEEF", 0xDEADBEEF},
Expand All @@ -280,6 +285,7 @@ static const std::map<std::string, std::int64_t> testValuesInt{
{"995862_262", 995862262},
{"995862262", 995862262},
{"-995862275", -995862275},
{"\t-995862275\t", -995862275},
{"-995'862'275", -995862275},
{"0b11010110", 0xD6},
{"0b1101'0110", 0xD6},
Expand Down

0 comments on commit 797e177

Please sign in to comment.