Alineación de textos en TFT

No, por eso tomo el substring, porque no conozco el número de dígitos.

Si, esa es la idea, al concatenar los espacios con los dígitos cadena aumenta y luego se trunca al tamaño deseado, es una simple concatenación no creo que haya que complicarla tanto llevándolo al terreno de matrices dinámicas.

Lo que haces en format_text_int() yo lo haría así

String format_text_int(long value, byte len, String sufix) {
  String text = "                ";
  text = text + String(value);
  text = text.substring(text.length() - len)) + sufix;
  return text;
}

Obviamente que solo trabaja con enteros pero ¿y si pasas el número como string?

String format_text_int(String value, byte len, String sufix) {
  String text = "                ";
  text = text + value;
  text = text.substring(text.length() - len)) + sufix;
  return text;
}

y la llamas con, por ejemplo,

float volts = 12.3;

@ format_text_int(String(volts), 10, "V");

long rpm = 12345;

@ format_text_int(String(rpm), 10, "RPM");

@ simboliza la sentencia que uses para imprimir.

sufix no lo has tomado en cuenta y queda excluido del len, no se si realmente es lo que quieres, o sea, solo justificar el número.

Así como está planteado, la salida quedaría

      12.3V
     12345RPM

Para justificar incluso el sufijo habría que hacer

String format_text_int(String value, byte len, String sufix) {
  String text = "                ";
  text = text + value + sufix;
  text = text.substring(text.length() - len));
  return text;
}

Y la salida sería

     12.3V
  12345RPM

Saludos

PD: Así como en arduino sprintf() no trabaja con float tampoco funciona con el modificador * .