Alineación de textos en TFT

Hola
@anon90500195
Muchas gracias. Esa es, más o menos, la función que he hecho. Vale si el número de digitos es conocido de antemano. Pero para que valga para cualquier número de dígitos tiene que ser un poco más compleja. Lo primero es que String cadena variará en tamaño, y para eso hay que hacer matrices dinámicas y tengo que decir que las pruebas que he hecho no han sido muy satisfactorias. La tengo hecha con un for para añadir los espacios correspondiente y tengo que decir que tengo que pulirla porque no funciona del todo bien.
Resumiendo, que si quiero que me formatee voltajes, los valores van a estar entre 1 y 20, por lo que si el valor fuese 1, la salida debería ser _1v, y si son 14, 14v (pongo _ para representar espacios). Así en la TFT tengo un espacio reservado para 2 dígitos y siempre estará alineado en su sitio. Pero si le mando formatear revoluciones, entonces los valores estarán desde 0 a 9999, con lo cual si es 1, la salida deberia ser ___1RPM y si son 3250, la salidad debería ser 3250RPM y reservo los espacios necesarios en la TFT.

/*
-value: valor para formatear
-len: longitud necesaria de la cadena
-sufix: sufijo para añadir (por ejemplo "RPM")
*/
String format_text_int(long value, byte len, String sufix)
{
  String text = String(value);
  byte len1 = text.length();
  if (len1 == len)
   return text;
  String spaces = "     ";
  spaces = spaces.substring(0, len - len1);
  text = spaces + text + sufix;
  return text;
}

Creo que es el space.substring el que me está dando problemas, pero la puliré.

@Surbyte
Muchas gracias por tu respuesta. No es un decimal lo que pretendía, es un entero "1234". Tienes toda la razón que el buffer tiene que ser de 6 en vez de 5, pero no funciona ni con 5, ni con 8, ni con 10...

byte longitud =6; // Longitud de la cadena de salida sea cual sea el número de cifras del valor
char texto [6] ; //Array para los char de salida
int numero =1234; // Valor del ejemplo (4 cifras)
sprintf("texto,|%*d|\n", longitud, numero);
//La salida debería ser _12345\0

El problema creo que está en la parte |%*d|. Según la documentación que he consultado (varias webs) el asterisco significa que tiene que coger la primera variable, es decir longitud lo cual, en este caso, debería ejecutar |%5d| y en el caso de que la longitud de los valores fuesen sólo 2 dígitos (por ejemplo del 1 al 99) debería ejecutar |%2d|

Este, me funciona perfectamente para convertir un byte en su string hexadecimal:

char  bufferEscritura[30]:
/*data_read es un struct.
uint16_t id:  Registro en la base de datos
uint8_t dl: Longitud de los datos que envia detrás (<=8)
uint8_t data[8]: byte Datos

name es un char que identifica a que base de datos. Es 'A', 'B' o 'C'
Los datos están leidos en otra función.

Ejemplo: id=100, dl=3 ,data = 0, 81, 125 (en hexadecimal 0x0064, 0x03, 0x00, 0x51, 0,x7D)
y tiene que ir a la base de datos 'A'
*/
void escribreDatos(char name, data_read *d) 
{
  memset(bufferEscritura, 0x00, sizeof(bufferEscritura)); //Llena el buffer con ceros
  uint8_t pos = 0;
  posicion += sprintf(bufferEscritura, "%c%04X", name, d.id);
  for (int i = 0; i < f.dl; i++)
  {
    posicion += sprintf(bufferEscritura + pos, "%02X", d.data[i]);
  } 

//La salida es 4100640300517D

No es mío, lo saqué de una página y lo adapté a mis necesidades.
El formato sería:
%c = Pasa el byte a char
%04X= Pon el id con cuatro dígitos (4) y en hexadecimal (X) y lo alineas a la izquierda y le pones ceros delante cuando tenga menos de 4 dígitos(0)
y con los datos
%02X = Pon el dato con dos dígitos (2) y en hexadecimal (X) y le pones ceros a la izquierda cuando tenga menos de 2 dígitos (0)

Muchas gracias a ambos por vuestro tiempo.

Editado para corregir un formato y añadir lo de las posiciones reservadas en la TFT.