From ae5728bbb4c8ee113be162361b3e2e1bd681d31d Mon Sep 17 00:00:00 2001 From: Nick Lefever Date: Thu, 16 Oct 2025 17:16:31 -0700 Subject: [PATCH] Extract ValueUnit percent formatting to separate file (#54170) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/54170 This diff extracts the `toString(double, char)` function used to format percent values from `ValueUnit` into a separate `DoubleConversions` file. This was added to graphics directly instead of moving it to core to avoid introducting cyclic dependencies since core depends on graphics. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D84714535 fbshipit-source-id: e41be90d211c28dba12e0920293698b3e1d3a1c7 --- .../renderer/graphics/DoubleConversions.cpp | 36 +++++++++++++++++++ .../renderer/graphics/DoubleConversions.h | 16 +++++++++ .../react/renderer/graphics/ValueUnit.cpp | 26 +------------- 3 files changed, 53 insertions(+), 25 deletions(-) create mode 100644 packages/react-native/ReactCommon/react/renderer/graphics/DoubleConversions.cpp create mode 100644 packages/react-native/ReactCommon/react/renderer/graphics/DoubleConversions.h diff --git a/packages/react-native/ReactCommon/react/renderer/graphics/DoubleConversions.cpp b/packages/react-native/ReactCommon/react/renderer/graphics/DoubleConversions.cpp new file mode 100644 index 00000000000..488f56bed23 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/graphics/DoubleConversions.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "DoubleConversions.h" + +#include +#include + +namespace facebook::react { + +std::string toString(double doubleValue, char suffix) { + // Format taken from folly's toString + static double_conversion::DoubleToStringConverter conv( + 0, + nullptr, + nullptr, + 'E', + -6, // detail::kConvMaxDecimalInShortestLow, + 21, // detail::kConvMaxDecimalInShortestHigh, + 6, // max leading padding zeros + 1); // max trailing padding zeros + std::array buffer{}; + double_conversion::StringBuilder builder(buffer.data(), buffer.size()); + if (!conv.ToShortest(doubleValue, &builder)) { + // Serialize infinite and NaN as 0 + builder.AddCharacter('0'); + } + builder.AddCharacter(suffix); + return builder.Finalize(); +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/graphics/DoubleConversions.h b/packages/react-native/ReactCommon/react/renderer/graphics/DoubleConversions.h new file mode 100644 index 00000000000..504b3c8804a --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/graphics/DoubleConversions.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include + +namespace facebook::react { + +std::string toString(double doubleValue, char suffix); + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/graphics/ValueUnit.cpp b/packages/react-native/ReactCommon/react/renderer/graphics/ValueUnit.cpp index 801aee979db..a8eabd55468 100644 --- a/packages/react-native/ReactCommon/react/renderer/graphics/ValueUnit.cpp +++ b/packages/react-native/ReactCommon/react/renderer/graphics/ValueUnit.cpp @@ -8,37 +8,13 @@ #include "ValueUnit.h" #ifdef RN_SERIALIZABLE_STATE -#include -#include -#include +#include "DoubleConversions.h" #endif namespace facebook::react { #ifdef RN_SERIALIZABLE_STATE -std::string toString(double doubleValue, char suffix) { - // Format taken from folly's toString - static double_conversion::DoubleToStringConverter conv( - 0, - NULL, - NULL, - 'E', - -6, // detail::kConvMaxDecimalInShortestLow, - 21, // detail::kConvMaxDecimalInShortestHigh, - 6, // max leading padding zeros - 1); // max trailing padding zeros - std::array buffer{}; - double_conversion::StringBuilder builder(buffer.data(), buffer.size()); - if (!conv.ToShortest(doubleValue, &builder)) { - // Serialize infinite and NaN as 0% - builder.AddCharacter('0'); - builder.AddCharacter('%'); - } - builder.AddCharacter(suffix); - return builder.Finalize(); -} - folly::dynamic ValueUnit::toDynamic() const { switch (unit) { case UnitType::Undefined: