diff --git a/src/internal/reader_common.h b/src/internal/reader_common.h index 7c84f1f9..09815d01 100644 --- a/src/internal/reader_common.h +++ b/src/internal/reader_common.h @@ -13,9 +13,18 @@ Value jsonToValue(nlohmann::json value) { if (value.is_string()) return value.get(); - else if (value.is_number()) - return std::stod(value.dump()); - else if (value.is_boolean()) + else if (value.is_number()) { + // Set locale to C to avoid conversion issues + std::string oldLocale = std::setlocale(LC_NUMERIC, nullptr); + std::setlocale(LC_NUMERIC, "C"); + + double converted = std::stod(value.dump()); + + // Restore old locale + std::setlocale(LC_NUMERIC, oldLocale.c_str()); + + return converted; + } else if (value.is_boolean()) return value.get(); else return value.dump(); diff --git a/test/load_project/load_project_test.cpp b/test/load_project/load_project_test.cpp index 639e4c0d..55ffce39 100644 --- a/test/load_project/load_project_test.cpp +++ b/test/load_project/load_project_test.cpp @@ -709,3 +709,21 @@ TEST(LoadProjectTest, LoadNullDimensionMonitor) Project p(name); ASSERT_TRUE(p.load()); } + +TEST(LoadProjectTest, LoadDoubleValue) +{ + // Regtest for #437 + std::string oldLocale = std::setlocale(LC_NUMERIC, nullptr); + std::setlocale(LC_NUMERIC, "sk_SK.UTF-8"); + + std::string name = "regtest_projects/437_load_double_values.sb3"; + Project p(name); + ASSERT_TRUE(p.load()); + + auto stage = p.engine()->stage(); + ASSERT_TRUE(stage); + ASSERT_VAR(stage, "test"); + ASSERT_EQ(GET_VAR(stage, "test")->value().toDouble(), 5.6654); + + std::setlocale(LC_NUMERIC, oldLocale.c_str()); +} diff --git a/test/regtest_projects/437_load_double_values.sb3 b/test/regtest_projects/437_load_double_values.sb3 new file mode 100644 index 00000000..918a7ae1 Binary files /dev/null and b/test/regtest_projects/437_load_double_values.sb3 differ