Skip to content

Commit

Permalink
fixed string to int conversion when number is double
Browse files Browse the repository at this point in the history
  • Loading branch information
alexpavlov96 authored and vpereverzev committed Sep 14, 2022
1 parent af7f69f commit dbdb895
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 2 deletions.
88 changes: 88 additions & 0 deletions src/framework/global/tests/string_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,28 @@ TEST_F(Global_Types_StringTests, String_ToInt)
EXPECT_FALSE(ok);
EXPECT_EQ(v, 0);
}

{
//! GIVEN Some string
String s("123.456");
//! DO
bool ok = false;
int v = s.toInt(&ok);
//! CHECK
EXPECT_TRUE(ok);
EXPECT_EQ(v, 123);
}

{
//! GIVEN Some string
String s("123.456a");
//! DO
bool ok = false;
int v = s.toInt(&ok);
//! CHECK
EXPECT_FALSE(ok);
EXPECT_EQ(v, 0);
}
}

TEST_F(Global_Types_StringTests, AsciiString_Construct)
Expand Down Expand Up @@ -695,6 +717,28 @@ TEST_F(Global_Types_StringTests, AsciiString_ToInt)
EXPECT_FALSE(ok);
EXPECT_EQ(v, 0);
}

{
//! GIVEN Some string
String s("123.456");
//! DO
bool ok = false;
int v = s.toInt(&ok);
//! CHECK
EXPECT_TRUE(ok);
EXPECT_EQ(v, 123);
}

{
//! GIVEN Some string
String s("123.456а");
//! DO
bool ok = false;
int v = s.toInt(&ok);
//! CHECK
EXPECT_FALSE(ok);
EXPECT_EQ(v, 0);
}
}

TEST_F(Global_Types_StringTests, AsciiString_ToDouble)
Expand All @@ -721,6 +765,50 @@ TEST_F(Global_Types_StringTests, AsciiString_ToDouble)
EXPECT_DOUBLE_EQ(v, 2.1);
}

{
//! GIVEN Some string
AsciiStringView s("2.1a");
//! DO
bool ok = false;
double v = s.toDouble(&ok);
//! CHECK
EXPECT_TRUE(ok);
EXPECT_DOUBLE_EQ(v, 2.1);
}

{
//! GIVEN Some string
AsciiStringView s("234a1");
//! DO
bool ok = false;
double v = s.toDouble(&ok);
//! CHECK
EXPECT_TRUE(ok);
EXPECT_DOUBLE_EQ(v, 234.0);
}

{
//! GIVEN Some string
AsciiStringView s("2.");
//! DO
bool ok = false;
double v = s.toDouble(&ok);
//! CHECK
EXPECT_TRUE(ok);
EXPECT_DOUBLE_EQ(v, 2.0);
}

{
//! GIVEN Some string
AsciiStringView s(".2");
//! DO
bool ok = false;
double v = s.toDouble(&ok);
//! CHECK
EXPECT_TRUE(ok);
EXPECT_DOUBLE_EQ(v, 0.2);
}

{
//! GIVEN Some string
AsciiStringView s("2,1");
Expand Down
12 changes: 10 additions & 2 deletions src/framework/global/types/string.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,19 @@ static long int toInt_helper(const char* str, bool* ok, int base)
}
const char* currentLoc = setlocale(LC_NUMERIC, "C");
char* end = nullptr;
long int v = static_cast<int>(std::strtol(str, &end, base));
long v = std::strtol(str, &end, base);
setlocale(LC_NUMERIC, currentLoc);
bool myOk = std::strlen(end) == 0;
if (!myOk) {
v = 0;
end++;
if (std::strlen(end) != 0) {
char* frEnd = nullptr;
std::strtol(end, &frEnd, base);
myOk = std::strlen(frEnd) == 0;
if (!myOk) {
v = 0;
}
}
}

if (ok) {
Expand Down

0 comments on commit dbdb895

Please sign in to comment.