diff --git a/src/json.hpp b/src/json.hpp
index b02a1344..3c57c42f 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -2097,6 +2097,8 @@ class basic_json
     string_t dump(const int indent = -1) const
     {
         std::stringstream ss;
+        // fix locale problems
+        ss.imbue(std::locale(std::locale(), new DecimalSeparator));
 
         if (indent >= 0)
         {
@@ -5655,6 +5657,8 @@ class basic_json
 
         // reset width to 0 for subsequent calls to this stream
         o.width(0);
+        // fix locale problems
+        o.imbue(std::locale(std::locale(), new DecimalSeparator));
 
         // do the actual serialization
         j.dump(o, pretty_print, static_cast<unsigned int>(indentation));
@@ -6128,11 +6132,8 @@ class basic_json
                     // string->double->string or string->long
                     // double->string; to be safe, we read this value from
                     // std::numeric_limits<number_float_t>::digits10
-                    std::stringstream ss;
-                    ss.imbue(std::locale(std::locale(), new DecimalSeparator));  // fix locale problems
-                    ss << std::setprecision(std::numeric_limits<double>::digits10)
-                       << m_value.number_float;
-                    o << ss.str();
+                    o << std::setprecision(std::numeric_limits<double>::digits10)
+                      << m_value.number_float;
                 }
                 return;
             }
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index aba10b49..63141e20 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -2097,6 +2097,8 @@ class basic_json
     string_t dump(const int indent = -1) const
     {
         std::stringstream ss;
+        // fix locale problems
+        ss.imbue(std::locale(std::locale(), new DecimalSeparator));
 
         if (indent >= 0)
         {
@@ -5655,6 +5657,8 @@ class basic_json
 
         // reset width to 0 for subsequent calls to this stream
         o.width(0);
+        // fix locale problems
+        o.imbue(std::locale(std::locale(), new DecimalSeparator));
 
         // do the actual serialization
         j.dump(o, pretty_print, static_cast<unsigned int>(indentation));
@@ -6128,11 +6132,8 @@ class basic_json
                     // string->double->string or string->long
                     // double->string; to be safe, we read this value from
                     // std::numeric_limits<number_float_t>::digits10
-                    std::stringstream ss;
-                    ss.imbue(std::locale(std::locale(), new DecimalSeparator));  // fix locale problems
-                    ss << std::setprecision(std::numeric_limits<double>::digits10)
-                       << m_value.number_float;
-                    o << ss.str();
+                    o << std::setprecision(std::numeric_limits<double>::digits10)
+                      << m_value.number_float;
                 }
                 return;
             }
diff --git a/test/src/unit.cpp b/test/src/unit.cpp
index fe3bc773..af16f00d 100644
--- a/test/src/unit.cpp
+++ b/test/src/unit.cpp
@@ -14079,6 +14079,10 @@ TEST_CASE("regression tests")
         CHECK(j1a.dump() == "23.42");
         CHECK(j1b.dump() == "23.42");
 
+        std::stringstream ss;
+        ss << j1a;
+        CHECK(ss.str() == "23.42");
+
         CHECK(j2a.dump() == "23.42");
         //issue #230
         //CHECK(j2b.dump() == "23.42");