From aa266826b5296a6abbdca80f2f7e7ea2961e446c Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sat, 27 Jan 2024 12:40:51 +0100 Subject: [PATCH] fix #437: Set locale to C in jsonValue() --- src/internal/reader_common.h | 15 ++++++++++++--- test/load_project/load_project_test.cpp | 18 ++++++++++++++++++ .../437_load_double_values.sb3 | Bin 0 -> 875 bytes 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 test/regtest_projects/437_load_double_values.sb3 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 0000000000000000000000000000000000000000..918a7ae1cd71f6d731fce606ffa64bb3e42bc0f9 GIT binary patch literal 875 zcmWIWW@h1HU|`^2xE*C3AuIf9)hR{>1_5RU1|FbjK~a8IYI2EQR&jn_Z%}Oh6$61k z`gM<#yC#`fPW7;v;6yOSFjYPeJ3vg9c*9p#Bw z{5bizF-xMtMAM&HSFiB5`+TuF^02xs`@MtbkKpfqcDfN($rtANJ$YdpK3(sEgsRBI z2_FKVE9LNh@~kwUqT|PSaO!8a4*o-1o{F_Jl&sw`ZI#ySO<}IZVR={5Hm_T?YQ;u} zn+vSgH=cAewYXeg@cD7Udkzol>XTL%>xFYe#p}!8yGG9wZ*TWuF^>}6YCJDy{xmJ_ ze+%1XfBDBP^p6&rb+EJSXu&0}yK~v4*%FMO_-#46@@!{-$$?10|1)2nyUW+HX*c6; z+2E$KH@_=37luv#?7i<|PraIWr&eFcj>e78Ia;NkTuREWpLggv^EGBQ+otv6@$2;O z-Pw~IbZYKm?&j+)^1%*)&NXI#E6#kF9(G0b%EEhPQy!eDPEDG=Z!(|Ny^VYJU--P~ zU-P!k9U%t#*Is@IV}ChOtnSXVwGPr24M($^SpqX0j9t5rM#epHtvTJ+t+YPqVB1ZJ zy%sWc%mFBI-f>QVaWXKjPXVzC5GSV?8JZfJq!^eQ8>XeCr6m~|85x+Q8l)zhrlwe! zB;^Ykrn|x1Sws3EqmXX=wq4}}onH|p}tO=