Skip to content

Commit f6c5da9

Browse files
committed
fix: #176: Use stringstream to convert double to string
1 parent 4e0073f commit f6c5da9

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

include/scratchcpp/value.h

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,23 @@ class LIBSCRATCHCPP_EXPORT Value
257257
case Type::Integer:
258258
return std::to_string(m_intValue);
259259
case Type::Double: {
260-
std::string s = std::to_string(m_doubleValue);
261-
s.erase(s.find_last_not_of('0') + 1, std::string::npos);
262-
if (s.back() == '.') {
263-
s.pop_back();
260+
std::stringstream stream;
261+
stream << m_doubleValue;
262+
std::string s = stream.str();
263+
std::size_t index;
264+
265+
for (int i = 0; i < 2; i++) {
266+
if (i == 0)
267+
index = s.find("e+");
268+
else
269+
index = s.find("e-");
270+
271+
if (index != std::string::npos) {
272+
while ((s.size() >= index + 3) && (s[index + 2] == '0'))
273+
s.erase(index + 2, 1);
274+
}
264275
}
276+
265277
return s;
266278
}
267279
case Type::Bool:

test/scratch_classes/value_test.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,16 @@ TEST(ValueTest, ToDouble)
824824
v = "-255.625";
825825
ASSERT_EQ(v.toDouble(), -255.625);
826826

827+
v = "9432.4e-12";
828+
ASSERT_EQ(v.toDouble(), 9.4324e-9);
829+
v = "-9432.4e-12";
830+
ASSERT_EQ(v.toDouble(), -9.4324e-9);
831+
832+
v = "9432.4e+6";
833+
ASSERT_EQ(v.toDouble(), 9.4324e+9);
834+
v = "-9432.4e+6";
835+
ASSERT_EQ(v.toDouble(), -9.4324e+9);
836+
827837
v = "false";
828838
ASSERT_EQ(v.toDouble(), 0.0);
829839
v = "true";
@@ -953,6 +963,20 @@ TEST(ValueTest, ToString)
953963
ASSERT_EQ(v.toString(), "-255.625");
954964
ASSERT_EQ(utf8::utf16to8(v.toUtf16()), v.toString());
955965

966+
v = "9432.4e-12";
967+
ASSERT_EQ(v.toString(), "9.4324e-9");
968+
ASSERT_EQ(utf8::utf16to8(v.toUtf16()), v.toString());
969+
v = "-9432.4e-12";
970+
ASSERT_EQ(v.toString(), "-9.4324e-9");
971+
ASSERT_EQ(utf8::utf16to8(v.toUtf16()), v.toString());
972+
973+
v = "9432.4e+6";
974+
ASSERT_EQ(v.toString(), "9.4324e+9");
975+
ASSERT_EQ(utf8::utf16to8(v.toUtf16()), v.toString());
976+
v = "-9432.4e+6";
977+
ASSERT_EQ(v.toString(), "-9.4324e+9");
978+
ASSERT_EQ(utf8::utf16to8(v.toUtf16()), v.toString());
979+
956980
v = "false";
957981
ASSERT_EQ(v.toString(), "false");
958982
ASSERT_EQ(utf8::utf16to8(v.toUtf16()), v.toString());

0 commit comments

Comments
 (0)