--- src/vspipe/vsjson.cpp.orig +++ src/vspipe/vsjson.cpp @@ -21,4 +21,8 @@ #include "vsjson.h" #include +#include +#include +#include +#include static bool isAsciiPrintable(const std::string &s) { @@ -31,5 +35,21 @@ static bool isAsciiPrintable(const std::string &s) { static std::string doubleToString(double v) { +#if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 130300 + std::ostringstream stream; + stream.imbue(std::locale::classic()); + stream << std::fixed << std::setprecision(std::numeric_limits::max_digits10) << v; + + std::string result = stream.str(); + if (const auto dot = result.find('.'); dot != std::string::npos) { + result.erase(result.find_last_not_of('0') + 1); + if (!result.empty() && result.back() == '.') + result.pop_back(); + } + if (result == "-0") + result = "0"; + return result; +#else char buffer[100]; auto res = std::to_chars(buffer, buffer + sizeof(buffer), v, std::chars_format::fixed); return std::string(buffer, res.ptr - buffer); +#endif } --- src/vspipe/vspipe.cpp.orig +++ src/vspipe/vspipe.cpp @@ -32,5 +32,9 @@ #include #include #include +#include +#include +#include +#include #include #include "../common/wave.h" @@ -282,5 +286,21 @@ static void outputFrame(const VSFrame *frame, VSPipeOutputData *data) { static std::string doubleToString(double v) { +#if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 130300 + std::ostringstream stream; + stream.imbue(std::locale::classic()); + stream << std::fixed << std::setprecision(std::numeric_limits::max_digits10) << v; + + std::string result = stream.str(); + if (const auto dot = result.find('.'); dot != std::string::npos) { + result.erase(result.find_last_not_of('0') + 1); + if (!result.empty() && result.back() == '.') + result.pop_back(); + } + if (result == "-0") + result = "0"; + return result; +#else char buffer[100]; auto res = std::to_chars(buffer, buffer + sizeof(buffer), v, std::chars_format::fixed); return std::string(buffer, res.ptr - buffer); +#endif }