diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp
index f6ff6eb75714e5914f54faccda5b0c24ea986de2..78d852357c64a93de5a81c42e0b92b298d379da1 100755
--- a/Marlin/ultralcd.cpp
+++ b/Marlin/ultralcd.cpp
@@ -28,6 +28,7 @@
 #include "temperature.h"
 #include "stepper.h"
 #include "configuration_store.h"
+#include "utility.h"
 
 #if ENABLED(PRINTCOUNTER)
   #include "printcounter.h"
@@ -1878,6 +1879,7 @@ void kill_screen(const char* lcd_msg) {
    *
    */
   #if ENABLED(FWRETRACT)
+
     static void lcd_control_retract_menu() {
       START_MENU();
       MENU_ITEM(back, MSG_CONTROL);
@@ -1895,6 +1897,7 @@ void kill_screen(const char* lcd_msg) {
       MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVERF, &retract_recover_feedrate_mm_s, 1, 999);
       END_MENU();
     }
+
   #endif // FWRETRACT
 
   #if ENABLED(SDSUPPORT)
@@ -2936,252 +2939,4 @@ void lcd_reset_alert_level() { lcd_status_message_level = 0; }
 
 #endif // ULTIPANEL
 
-/*********************************/
-/** Number to string conversion **/
-/*********************************/
-
-#define DIGIT(n) ('0' + (n))
-#define DIGIMOD(n) DIGIT((n) % 10)
-
-char conv[8];
-
-// Convert float to rj string with 123 or -12 format
-char *ftostr3(const float& x) { return itostr3((int)x); }
-
-// Convert float to rj string with _123, -123, _-12, or __-1 format
-char *ftostr4sign(const float& x) { return itostr4sign((int)x); }
-
-// Convert unsigned int to string with 12 format
-char* itostr2(const uint8_t& x) {
-  int xx = x;
-  conv[0] = DIGIMOD(xx / 10);
-  conv[1] = DIGIMOD(xx);
-  conv[2] = '\0';
-  return conv;
-}
-
-// Convert float to string with +123.4 / -123.4 format
-char* ftostr41sign(const float& x) {
-  int xx = int(abs(x * 10)) % 10000;
-  conv[0] = x >= 0 ? '+' : '-';
-  conv[1] = DIGIMOD(xx / 1000);
-  conv[2] = DIGIMOD(xx / 100);
-  conv[3] = DIGIMOD(xx / 10);
-  conv[4] = '.';
-  conv[5] = DIGIMOD(xx);
-  conv[6] = '\0';
-  return conv;
-}
-
-// Convert signed float to string with 023.45 / -23.45 format
-char *ftostr32(const float& x) {
-  long xx = abs(x * 100);
-  conv[0] = x >= 0 ? DIGIMOD(xx / 10000) : '-';
-  conv[1] = DIGIMOD(xx / 1000);
-  conv[2] = DIGIMOD(xx / 100);
-  conv[3] = '.';
-  conv[4] = DIGIMOD(xx / 10);
-  conv[5] = DIGIMOD(xx);
-  conv[6] = '\0';
-  return conv;
-}
-
-// Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format
-char* ftostr43sign(const float& x, char plus/*=' '*/) {
-  long xx = x * 1000;
-  if (xx == 0)
-    conv[0] = ' ';
-  else if (xx > 0)
-    conv[0] = plus;
-  else {
-    xx = -xx;
-    conv[0] = '-';
-  }
-  conv[1] = DIGIMOD(xx / 1000);
-  conv[2] = '.';
-  conv[3] = DIGIMOD(xx / 100);
-  conv[4] = DIGIMOD(xx / 10);
-  conv[5] = DIGIMOD(xx);
-  conv[6] = '\0';
-  return conv;
-}
-
-// Convert unsigned float to string with 1.23 format
-char* ftostr12ns(const float& x) {
-  long xx = x * 100;
-  xx = abs(xx);
-  conv[0] = DIGIMOD(xx / 100);
-  conv[1] = '.';
-  conv[2] = DIGIMOD(xx / 10);
-  conv[3] = DIGIMOD(xx);
-  conv[4] = '\0';
-  return conv;
-}
-
-// Convert signed int to lj string with +012 / -012 format
-char* itostr3sign(const int& x) {
-  int xx;
-  if (x >= 0) {
-    conv[0] = '+';
-    xx = x;
-  }
-  else {
-    conv[0] = '-';
-    xx = -x;
-  }
-  conv[1] = DIGIMOD(xx / 100);
-  conv[2] = DIGIMOD(xx / 10);
-  conv[3] = DIGIMOD(xx);
-  conv[4] = '.';
-  conv[5] = '0';
-  conv[6] = '\0';
-  return conv;
-}
-
-// Convert signed int to rj string with 123 or -12 format
-char* itostr3(const int& x) {
-  int xx = x;
-  if (xx < 0) {
-    conv[0] = '-';
-    xx = -xx;
-  }
-  else
-    conv[0] = xx >= 100 ? DIGIMOD(xx / 100) : ' ';
-
-  conv[1] = xx >= 10 ? DIGIMOD(xx / 10) : ' ';
-  conv[2] = DIGIMOD(xx);
-  conv[3] = '\0';
-  return conv;
-}
-
-// Convert unsigned int to lj string with 123 format
-char* itostr3left(const int& xx) {
-  if (xx >= 100) {
-    conv[0] = DIGIMOD(xx / 100);
-    conv[1] = DIGIMOD(xx / 10);
-    conv[2] = DIGIMOD(xx);
-    conv[3] = '\0';
-  }
-  else if (xx >= 10) {
-    conv[0] = DIGIMOD(xx / 10);
-    conv[1] = DIGIMOD(xx);
-    conv[2] = '\0';
-  }
-  else {
-    conv[0] = DIGIMOD(xx);
-    conv[1] = '\0';
-  }
-  return conv;
-}
-
-// Convert signed int to rj string with _123, -123, _-12, or __-1 format
-char *itostr4sign(const int& x) {
-  int xx = abs(x);
-  int sign = 0;
-  if (xx >= 100) {
-    conv[1] = DIGIMOD(xx / 100);
-    conv[2] = DIGIMOD(xx / 10);
-  }
-  else if (xx >= 10) {
-    conv[0] = ' ';
-    sign = 1;
-    conv[2] = DIGIMOD(xx / 10);
-  }
-  else {
-    conv[0] = ' ';
-    conv[1] = ' ';
-    sign = 2;
-  }
-  conv[sign] = x < 0 ? '-' : ' ';
-  conv[3] = DIGIMOD(xx);
-  conv[4] = '\0';
-  return conv;
-}
-
-// Convert unsigned float to rj string with 12345 format
-char* ftostr5rj(const float& x) {
-  long xx = abs(x);
-  conv[0] = xx >= 10000 ? DIGIMOD(xx / 10000) : ' ';
-  conv[1] = xx >= 1000 ? DIGIMOD(xx / 1000) : ' ';
-  conv[2] = xx >= 100 ? DIGIMOD(xx / 100) : ' ';
-  conv[3] = xx >= 10 ? DIGIMOD(xx / 10) : ' ';
-  conv[4] = DIGIMOD(xx);
-  conv[5] = '\0';
-  return conv;
-}
-
-// Convert signed float to string with +1234.5 format
-char* ftostr51sign(const float& x) {
-  long xx = abs(x * 10);
-  conv[0] = (x >= 0) ? '+' : '-';
-  conv[1] = DIGIMOD(xx / 10000);
-  conv[2] = DIGIMOD(xx / 1000);
-  conv[3] = DIGIMOD(xx / 100);
-  conv[4] = DIGIMOD(xx / 10);
-  conv[5] = '.';
-  conv[6] = DIGIMOD(xx);
-  conv[7] = '\0';
-  return conv;
-}
-
-// Convert signed float to string with +123.45 format
-char* ftostr52sign(const float& x) {
-  long xx = abs(x * 100);
-  conv[0] = (x >= 0) ? '+' : '-';
-  conv[1] = DIGIMOD(xx / 10000);
-  conv[2] = DIGIMOD(xx / 1000);
-  conv[3] = DIGIMOD(xx / 100);
-  conv[4] = '.';
-  conv[5] = DIGIMOD(xx / 10);
-  conv[6] = DIGIMOD(xx);
-  conv[7] = '\0';
-  return conv;
-}
-
-// Convert signed float to space-padded string with -_23.4_ format
-char* ftostr52sp(const float& x) {
-  long xx = x * 100;
-  uint8_t dig;
-  if (xx < 0) { // negative val = -_0
-    xx = -xx;
-    conv[0] = '-';
-    dig = (xx / 1000) % 10;
-    conv[1] = dig ? DIGIT(dig) : ' ';
-  }
-  else { // positive val = __0
-    dig = (xx / 10000) % 10;
-    if (dig) {
-      conv[0] = DIGIT(dig);
-      conv[1] = DIGIMOD(xx / 1000);
-    }
-    else {
-      conv[0] = ' ';
-      dig = (xx / 1000) % 10;
-      conv[1] = dig ? DIGIT(dig) : ' ';
-    }
-  }
-
-  conv[2] = DIGIMOD(xx / 100); // lsd always
-
-  dig = xx % 10;
-  if (dig) { // 2 decimal places
-    conv[5] = DIGIT(dig);
-    conv[4] = DIGIMOD(xx / 10);
-    conv[3] = '.';
-  }
-  else { // 1 or 0 decimal place
-    dig = (xx / 10) % 10;
-    if (dig) {
-      conv[4] = DIGIT(dig);
-      conv[3] = '.';
-    }
-    else {
-      conv[3] = conv[4] = ' ';
-    }
-    conv[5] = ' ';
-  }
-  conv[6] = '\0';
-  return conv;
-}
-
 #endif // ULTRA_LCD
diff --git a/Marlin/ultralcd.h b/Marlin/ultralcd.h
index 4cc8334ec91521b101aab0d6a640c34739541b0a..3652da00573404295b057faf015a7288a19a6098 100644
--- a/Marlin/ultralcd.h
+++ b/Marlin/ultralcd.h
@@ -167,21 +167,4 @@
 
 #endif //ULTRA_LCD
 
-char* itostr2(const uint8_t& x);
-char* itostr3sign(const int& x);
-char* itostr3(const int& x);
-char* itostr3left(const int& x);
-char* itostr4sign(const int& x);
-
-char* ftostr3(const float& x);
-char* ftostr4sign(const float& x);
-char* ftostr41sign(const float& x);
-char* ftostr32(const float& x);
-char* ftostr43sign(const float& x, char plus=' ');
-char* ftostr12ns(const float& x);
-char* ftostr5rj(const float& x);
-char* ftostr51sign(const float& x);
-char* ftostr52sign(const float& x);
-char* ftostr52sp(const float& x); // remove zero-padding from ftostr32
-
 #endif //ULTRALCD_H
diff --git a/Marlin/ultralcd_impl_DOGM.h b/Marlin/ultralcd_impl_DOGM.h
index c5353a605fc1a7a03bf5be68d385be429d28783f..6ea60b4164d4746e0cc05da85e64eb204ed6e8c7 100644
--- a/Marlin/ultralcd_impl_DOGM.h
+++ b/Marlin/ultralcd_impl_DOGM.h
@@ -45,6 +45,7 @@
 #include "ultralcd.h"
 #include "ultralcd_st7920_u8glib_rrd.h"
 #include "dogm_bitmaps.h"
+#include "utility.h"
 #include "duration_t.h"
 
 #include <U8glib.h>
diff --git a/Marlin/ultralcd_impl_HD44780.h b/Marlin/ultralcd_impl_HD44780.h
index 05a892be72917c4742fefda777b3c47c87f55701..142fe68619b9159cd5e40869b075d7b4e598e2f4 100644
--- a/Marlin/ultralcd_impl_HD44780.h
+++ b/Marlin/ultralcd_impl_HD44780.h
@@ -24,9 +24,11 @@
 #define ULTRALCD_IMPL_HD44780_H
 
 /**
-* Implementation of the LCD display routines for a Hitachi HD44780 display. These are common LCD character displays.
-**/
+ * Implementation of the LCD display routines for a Hitachi HD44780 display.
+ * These are the most common LCD character displays.
+ */
 
+#include "utility.h"
 #include "duration_t.h"
 
 extern volatile uint8_t buttons;  //an extended version of the last checked buttons in a bit array.
diff --git a/Marlin/utility.cpp b/Marlin/utility.cpp
index 0285219c4022f1e00a7236ed70eba0d756b5c778..b2d09004c966d509de7c1090671ff47d3fe56eac 100644
--- a/Marlin/utility.cpp
+++ b/Marlin/utility.cpp
@@ -32,3 +32,186 @@ void safe_delay(millis_t ms) {
   }
   delay(ms);
 }
+
+#if ENABLED(ULTRA_LCD)
+
+  char conv[8];
+
+  #define DIGIT(n) ('0' + (n))
+  #define DIGIMOD(n, f) DIGIT((n)/(f) % 10)
+  #define RJDIGIT(n, f) ((n) >= (f) ? DIGIMOD(n, f) : ' ')
+  #define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-'))
+
+  // Convert unsigned int to string with 12 format
+  char* itostr2(const uint8_t& x) {
+    int xx = x;
+    conv[0] = DIGIMOD(xx, 10);
+    conv[1] = DIGIMOD(xx, 1);
+    conv[2] = '\0';
+    return conv;
+  }
+
+  // Convert signed int to rj string with 123 or -12 format
+  char* itostr3(const int& x) {
+    int xx = x;
+    conv[0] = MINUSOR(xx, RJDIGIT(xx, 100));
+    conv[1] = RJDIGIT(xx, 10);
+    conv[2] = DIGIMOD(xx, 1);
+    conv[3] = '\0';
+    return conv;
+  }
+
+  // Convert unsigned int to lj string with 123 format
+  char* itostr3left(const int& xx) {
+    char *str = &conv[3];
+    *str = '\0';
+    *(--str) = DIGIMOD(xx, 1);
+    if (xx >= 10) {
+      *(--str) = DIGIMOD(xx, 10);
+      if (xx >= 100)
+        *(--str) = DIGIMOD(xx, 100);
+    }
+    return str;
+  }
+
+  // Convert signed int to rj string with _123, -123, _-12, or __-1 format
+  char *itostr4sign(const int& x) {
+    int xx = abs(x), sign = 0;
+    if (xx >= 100) {
+      conv[1] = DIGIMOD(xx, 100);
+      conv[2] = DIGIMOD(xx, 10);
+    }
+    else {
+      conv[0] = ' ';
+      if (xx >= 10) {
+        sign = 1;
+        conv[2] = DIGIMOD(xx, 10);
+      }
+      else {
+        conv[1] = ' ';
+        sign = 2;
+      }
+    }
+    conv[sign] = x < 0 ? '-' : ' ';
+    conv[3] = DIGIMOD(xx, 1);
+    conv[4] = '\0';
+    return conv;
+  }
+
+  // Convert unsigned float to string with 1.23 format
+  char* ftostr12ns(const float& x) {
+    long xx = abs(x * 100);
+    conv[0] = DIGIMOD(xx, 100);
+    conv[1] = '.';
+    conv[2] = DIGIMOD(xx, 10);
+    conv[3] = DIGIMOD(xx, 1);
+    conv[4] = '\0';
+    return conv;
+  }
+
+  // Convert signed float to fixed-length string with 023.45 / -23.45 format
+  char *ftostr32(const float& x) {
+    long xx = x * 100;
+    conv[0] = MINUSOR(xx, DIGIMOD(xx, 10000));
+    conv[1] = DIGIMOD(xx, 1000);
+    conv[2] = DIGIMOD(xx, 100);
+    conv[3] = '.';
+    conv[4] = DIGIMOD(xx, 10);
+    conv[5] = DIGIMOD(xx, 1);
+    conv[6] = '\0';
+    return conv;
+  }
+
+  // Convert float to fixed-length string with +123.4 / -123.4 format
+  char* ftostr41sign(const float& x) {
+    int xx = x * 10;
+    conv[0] = MINUSOR(xx, '+');
+    conv[1] = DIGIMOD(xx, 1000);
+    conv[2] = DIGIMOD(xx, 100);
+    conv[3] = DIGIMOD(xx, 10);
+    conv[4] = '.';
+    conv[5] = DIGIMOD(xx, 1);
+    conv[6] = '\0';
+    return conv;
+  }
+
+  // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format
+  char* ftostr43sign(const float& x, char plus/*=' '*/) {
+    long xx = x * 1000;
+    conv[0] = xx ? MINUSOR(xx, plus) : ' ';
+    conv[1] = DIGIMOD(xx, 1000);
+    conv[2] = '.';
+    conv[3] = DIGIMOD(xx, 100);
+    conv[4] = DIGIMOD(xx, 10);
+    conv[5] = DIGIMOD(xx, 1);
+    conv[6] = '\0';
+    return conv;
+  }
+
+  // Convert unsigned float to rj string with 12345 format
+  char* ftostr5rj(const float& x) {
+    long xx = abs(x);
+    conv[0] = RJDIGIT(xx, 10000);
+    conv[1] = RJDIGIT(xx, 1000);
+    conv[2] = RJDIGIT(xx, 100);
+    conv[3] = RJDIGIT(xx, 10);
+    conv[4] = DIGIMOD(xx, 1);
+    conv[5] = '\0';
+    return conv;
+  }
+
+  // Convert signed float to string with +1234.5 format
+  char* ftostr51sign(const float& x) {
+    long xx = x * 10;
+    conv[0] = MINUSOR(xx, '+');
+    conv[1] = DIGIMOD(xx, 10000);
+    conv[2] = DIGIMOD(xx, 1000);
+    conv[3] = DIGIMOD(xx, 100);
+    conv[4] = DIGIMOD(xx, 10);
+    conv[5] = '.';
+    conv[6] = DIGIMOD(xx, 1);
+    conv[7] = '\0';
+    return conv;
+  }
+
+  // Convert signed float to string with +123.45 format
+  char* ftostr52sign(const float& x) {
+    long xx = x * 100;
+    conv[0] = MINUSOR(xx, '+');
+    conv[1] = DIGIMOD(xx, 10000);
+    conv[2] = DIGIMOD(xx, 1000);
+    conv[3] = DIGIMOD(xx, 100);
+    conv[4] = '.';
+    conv[5] = DIGIMOD(xx, 10);
+    conv[6] = DIGIMOD(xx, 1);
+    conv[7] = '\0';
+    return conv;
+  }
+
+  // Convert signed float to space-padded string with -_23.4_ format
+  char* ftostr52sp(const float& x) {
+    long xx = x * 100;
+    uint8_t dig;
+    conv[0] = MINUSOR(xx, RJDIGIT(xx, 10000));
+    conv[1] = RJDIGIT(xx, 1000);
+    conv[2] = DIGIMOD(xx, 100);
+
+    if ((dig = xx % 10)) {          // second digit after decimal point?
+      conv[3] = '.';
+      conv[4] = DIGIMOD(xx, 10);
+      conv[5] = DIGIT(dig);
+    }
+    else {
+      if ((dig = (xx / 10) % 10)) { // first digit after decimal point?
+        conv[3] = '.';
+        conv[4] = DIGIT(dig);
+      }
+      else                          // nothing after decimal point
+        conv[3] = conv[4] = ' ';
+      conv[5] = ' ';
+    }
+    conv[6] = '\0';
+    return conv;
+  }
+
+#endif // ULTRA_LCD
diff --git a/Marlin/utility.h b/Marlin/utility.h
index 8ca70dbf8392e1cd60ecdbf406ae2f437e24eefe..8b107e7fd3857441e9996f9c04a7f1893c5e14c5 100644
--- a/Marlin/utility.h
+++ b/Marlin/utility.h
@@ -25,4 +25,50 @@
 
 void safe_delay(millis_t ms);
 
-#endif
+#if ENABLED(ULTRA_LCD)
+
+  // Convert unsigned int to string with 12 format
+  char* itostr2(const uint8_t& x);
+
+  // Convert signed int to rj string with 123 or -12 format
+  char* itostr3(const int& x);
+
+  // Convert unsigned int to lj string with 123 format
+  char* itostr3left(const int& xx);
+
+  // Convert signed int to rj string with _123, -123, _-12, or __-1 format
+  char *itostr4sign(const int& x);
+
+  // Convert unsigned float to string with 1.23 format
+  char* ftostr12ns(const float& x);
+
+  // Convert signed float to fixed-length string with 023.45 / -23.45 format
+  char *ftostr32(const float& x);
+
+  // Convert float to fixed-length string with +123.4 / -123.4 format
+  char* ftostr41sign(const float& x);
+
+  // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format
+  char* ftostr43sign(const float& x, char plus=' ');
+
+  // Convert unsigned float to rj string with 12345 format
+  char* ftostr5rj(const float& x);
+
+  // Convert signed float to string with +1234.5 format
+  char* ftostr51sign(const float& x);
+
+  // Convert signed float to space-padded string with -_23.4_ format
+  char* ftostr52sp(const float& x);
+
+  // Convert signed float to string with +123.45 format
+  char* ftostr52sign(const float& x);
+
+  // 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); }
+
+#endif // ULTRA_LCD
+
+#endif // __UTILITY_H__