diff --git a/Marlin/utility.cpp b/Marlin/utility.cpp
index 8f06817c0fd5c8de3c1ee006b4a31c4c5ab7d71d..31be8275ce886b9509d3016bd51b561835140269 100644
--- a/Marlin/utility.cpp
+++ b/Marlin/utility.cpp
@@ -129,6 +129,30 @@ void safe_delay(millis_t ms) {
     return conv;
   }
 
+  // Convert float to rj string with 1234, _123, -123, _-12, 12.3, _1.2, or -1.2 format
+  char *ftostr4sign(const float& fx) { 
+    int x = fx * 10, xx = abs(x);
+    bool ispos = x >= 0,
+         isten = xx >= 100,
+         ishun = xx >= 1000;
+    if (!isten || (ispos && !ishun)) {
+      // 12.3, _1.2, -1.2
+      conv[0] = ispos ? (isten ? DIGIMOD(xx, 100) : ' ') : '-';
+      conv[1] = DIGIMOD(xx, 10);
+      conv[2] = '.';
+      conv[3] = DIGIMOD(xx, 1);
+    }
+    else {
+      // 1234, _123, -123, _-12
+      conv[0] = ispos ? (xx >= 10000 ? DIGIMOD(xx, 10000) : ' ') : (ishun ? '-' : ' ');
+      conv[1] = ishun ? DIGIMOD(xx, 1000) : '-';
+      conv[2] = DIGIMOD(xx, 100);
+      conv[3] = DIGIMOD(xx, 10);
+    }
+    conv[4] = '\0';
+    return conv;
+  }
+
   // Convert float to fixed-length string with +123.4 / -123.4 format
   char* ftostr41sign(const float& x) {
     int xx = x * 10;
diff --git a/Marlin/utility.h b/Marlin/utility.h
index 95c98579370c51f4b46a1ad8be0fcfb56ae5ee04..4bdf18f344acf66864736afaf44a9dca0b092ffa 100644
--- a/Marlin/utility.h
+++ b/Marlin/utility.h
@@ -69,8 +69,8 @@ void safe_delay(millis_t ms);
   // Convert float to rj string with 123 or -12 format
   FORCE_INLINE char *ftostr3(const float& x) { return itostr3((int)x); }
 
-  // Convert float to rj string with _123, -123, _-12, or __-1 format
-  FORCE_INLINE char *ftostr4sign(const float& x) { return itostr4sign((int)x); }
+  // Convert float to rj string with 1234, _123, 12.3, _1.2, -123, _-12, or -1.2 format
+  char *ftostr4sign(const float& fx);
 
 #endif // ULTRA_LCD