Skip to content

Commit 6499127

Browse files
committed
Add value_stringToDoubleWithCheck() function
1 parent c0e5697 commit 6499127

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

include/scratchcpp/value_functions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ extern "C"
8585
LIBSCRATCHCPP_EXPORT StringPtr *value_doubleToStringPtr(double v);
8686
LIBSCRATCHCPP_EXPORT const StringPtr *value_boolToStringPtr(bool v);
8787
LIBSCRATCHCPP_EXPORT double value_stringToDouble(const StringPtr *s);
88+
LIBSCRATCHCPP_EXPORT double value_stringToDoubleWithCheck(const StringPtr *s, bool *ok);
8889
LIBSCRATCHCPP_EXPORT bool value_stringToBool(const StringPtr *s);
8990

9091
LIBSCRATCHCPP_EXPORT void value_add(const ValueData *v1, const ValueData *v2, ValueData *dst);

src/scratch/value_functions.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,22 @@ extern "C"
501501
return value_stringToDoubleImpl(s->data, s->size);
502502
}
503503

504+
/*!
505+
* Converts the given string to double.
506+
* \param[out] ok Whether the conversion was successful.
507+
*/
508+
double value_stringToDoubleWithCheck(const StringPtr *s, bool *ok)
509+
{
510+
*ok = true;
511+
512+
if (string_compare_case_sensitive(s, &INFINITY_STR) == 0)
513+
return std::numeric_limits<double>::infinity();
514+
else if (string_compare_case_sensitive(s, &NEGATIVE_INFINITY_STR) == 0)
515+
return -std::numeric_limits<double>::infinity();
516+
517+
return value_stringToDoubleImpl(s->data, s->size, ok);
518+
}
519+
504520
/*! Converts the given string to boolean. */
505521
bool value_stringToBool(const StringPtr *s)
506522
{

test/scratch_classes/value_test.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3387,6 +3387,57 @@ TEST(ValueTest, StringToDouble)
33873387
ASSERT_EQ(value_stringToDouble(string_pool_new_assign("0b-1")), 0.0);
33883388
}
33893389

3390+
TEST(ValueTest, StringToDoubleWithCheck)
3391+
{
3392+
bool ok;
3393+
3394+
ASSERT_EQ(value_stringToDoubleWithCheck(string_pool_new_assign("2147483647"), &ok), 2147483647.0);
3395+
ASSERT_TRUE(ok);
3396+
3397+
ASSERT_EQ(value_stringToDoubleWithCheck(string_pool_new_assign("-255.625"), &ok), -255.625);
3398+
ASSERT_TRUE(ok);
3399+
3400+
ASSERT_EQ(value_stringToDoubleWithCheck(string_pool_new_assign("0"), &ok), 0.0);
3401+
ASSERT_TRUE(ok);
3402+
3403+
ASSERT_EQ(value_stringToDoubleWithCheck(string_pool_new_assign("-0"), &ok), -0.0);
3404+
ASSERT_TRUE(ok);
3405+
3406+
ASSERT_EQ(value_stringToDoubleWithCheck(string_pool_new_assign("+.15"), &ok), 0.15);
3407+
ASSERT_TRUE(ok);
3408+
3409+
ASSERT_EQ(value_stringToDoubleWithCheck(string_pool_new_assign("0+5"), &ok), 0.0);
3410+
ASSERT_FALSE(ok);
3411+
3412+
ASSERT_EQ(value_stringToDoubleWithCheck(string_pool_new_assign("0-5"), &ok), 0.0);
3413+
ASSERT_FALSE(ok);
3414+
3415+
ASSERT_EQ(value_stringToDoubleWithCheck(string_pool_new_assign("1 2 3"), &ok), 0.0);
3416+
ASSERT_FALSE(ok);
3417+
3418+
ASSERT_EQ(value_stringToDoubleWithCheck(string_pool_new_assign("false"), &ok), 0.0);
3419+
ASSERT_FALSE(ok);
3420+
3421+
ASSERT_EQ(value_stringToDoubleWithCheck(string_pool_new_assign("true"), &ok), 0.0);
3422+
ASSERT_FALSE(ok);
3423+
3424+
double result = value_stringToDoubleWithCheck(string_pool_new_assign("Infinity"), &ok);
3425+
ASSERT_GT(result, 0);
3426+
ASSERT_TRUE(std::isinf(result));
3427+
ASSERT_TRUE(ok);
3428+
3429+
result = value_stringToDoubleWithCheck(string_pool_new_assign("-Infinity"), &ok);
3430+
ASSERT_LT(result, 0);
3431+
ASSERT_TRUE(std::isinf(result));
3432+
ASSERT_TRUE(ok);
3433+
3434+
ASSERT_EQ(value_stringToDoubleWithCheck(string_pool_new_assign("NaN"), &ok), 0.0);
3435+
ASSERT_FALSE(ok);
3436+
3437+
ASSERT_EQ(value_stringToDoubleWithCheck(string_pool_new_assign("something"), &ok), 0.0);
3438+
ASSERT_FALSE(ok);
3439+
}
3440+
33903441
TEST(ValueTest, StringToBool)
33913442
{
33923443
ASSERT_TRUE(value_stringToBool(string_pool_new_assign("2147483647")));

0 commit comments

Comments
 (0)