diff --git a/phosphor-power-sequencer/src/format_utils.hpp b/phosphor-power-sequencer/src/format_utils.hpp
new file mode 100644
index 0000000..327e518
--- /dev/null
+++ b/phosphor-power-sequencer/src/format_utils.hpp
@@ -0,0 +1,58 @@
+/**
+ * Copyright © 2024 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <format>
+#include <span>
+#include <string>
+
+/**
+ * @namespace format_utils
+ *
+ * Contains utility functions for formatting data.
+ */
+namespace phosphor::power::sequencer::format_utils
+{
+
+/**
+ * Returns a string containing the elements in the specified container span.
+ *
+ * The string starts with "[", ends with "]", and the elements are separated by
+ * ", ".  The individual elements are formatted using std::format.
+ *
+ * This function is a temporary solution until g++ implements the C++23
+ * std::format() support for formatting ranges.
+ *
+ * @param span span of elements to format within a container
+ * @return formatted string containing the specified elements
+ */
+template <typename T>
+std::string toString(const std::span<T>& span)
+{
+    std::string str{"["};
+    for (auto it = span.cbegin(); it != span.cend(); ++it)
+    {
+        str += std::format("{}", *it);
+        if (std::distance(it, span.cend()) > 1)
+        {
+            str += ", ";
+        }
+    }
+    str += "]";
+    return str;
+}
+
+} // namespace phosphor::power::sequencer::format_utils
diff --git a/phosphor-power-sequencer/test/format_utils_tests.cpp b/phosphor-power-sequencer/test/format_utils_tests.cpp
new file mode 100644
index 0000000..794630f
--- /dev/null
+++ b/phosphor-power-sequencer/test/format_utils_tests.cpp
@@ -0,0 +1,62 @@
+/**
+ * Copyright © 2024 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "format_utils.hpp"
+
+#include <array>
+#include <span>
+#include <string>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+using namespace phosphor::power::sequencer::format_utils;
+
+TEST(FormatUtilsTests, toString)
+{
+    // Test with spans from integer vector
+    {
+        std::vector<int> vec{1, 3, 5, 7, 9, 11};
+        std::span<int> spn{vec};
+        EXPECT_EQ(toString(spn), "[1, 3, 5, 7, 9, 11]");
+        EXPECT_EQ(toString(spn.subspan(0, 4)), "[1, 3, 5, 7]");
+        EXPECT_EQ(toString(spn.subspan(3, 3)), "[7, 9, 11]");
+        EXPECT_EQ(toString(spn.subspan(5, 1)), "[11]");
+        EXPECT_EQ(toString(spn.subspan(0, 0)), "[]");
+    }
+
+    // Test with spans from double vector
+    {
+        std::vector<double> vec{2.1, -3.9, 21.03};
+        std::span<double> spn{vec};
+        EXPECT_EQ(toString(spn), "[2.1, -3.9, 21.03]");
+    }
+
+    // Test with span from empty vector
+    {
+        std::vector<int> vec{};
+        std::span<int> spn{vec};
+        EXPECT_EQ(toString(spn), "[]");
+    }
+
+    // Test with spans from string array
+    {
+        std::array<std::string, 3> ary{"cow", "horse", "zebra"};
+        std::span<std::string> spn{ary};
+        EXPECT_EQ(toString(spn), "[cow, horse, zebra]");
+        EXPECT_EQ(toString(spn.subspan(1, 2)), "[horse, zebra]");
+    }
+}
diff --git a/phosphor-power-sequencer/test/meson.build b/phosphor-power-sequencer/test/meson.build
index 6bce451..9d1547b 100644
--- a/phosphor-power-sequencer/test/meson.build
+++ b/phosphor-power-sequencer/test/meson.build
@@ -2,6 +2,7 @@
      executable('phosphor-power-sequencer-tests',
                 'config_file_parser_error_tests.cpp',
                 'config_file_parser_tests.cpp',
+                'format_utils_tests.cpp',
                 'rail_tests.cpp',
                 dependencies: [
                     gmock,
