Separar números por decenas, centenas, millares...etc

Como puedo hacer para que el lcd para hacer una suma separada me Arduino los números en decenas, centenas, etc …?. Yo quiero que aparezca bien 999.999.999, separados por puntos o comas. He intentado varias cosas y tal, pero no consigo sacarlo. ¿Alguien podría ayudarme?

Serian los números de abajo en la foto, que es el marcador de un Pinball

Prueba algo así:

  char buffer[15];
  unsigned long numero = 35000000;
  sprintf(buffer, "%02d,%03d,%03d", numero / 1000000, (numero%1000000)/1000, numero%1000);
  Serial.print(buffer);

Lo tendria que comprobar, pero me parece mucho mas rápido para el procesador hacer

sprintf(buffer, "%d", numero);

Y luego recorrer el buffer del revés (desde las unidades), y cada tres caracteres intercalar un '.' pasándolo todo al buffer final.

no tengo el compilador aqui y el compilador online no me funciona así que no lo puedo probar

Estimado noter y GO_zalo:

Los felicito por el código y el manejo de texto. Yo cuando vi que se quería pensé que en 10 o 20 lineas de código lo podía resolver. Pero noter lo hizo en una sola !!! :D . A mi me pareció inmejorable, pero luego GO_zalo ve una manera de optimizarlo (a mi no me hubiera preocupado, prefiero que el código este correcto y elegante antes que optimo) y esta mejor.

El iniciador del post, como la mayoría de las veces en este foro en español, desapareció o esta escondido. ¿gasta mucho las teclas escribir gracias, solucionado, etc?

Saludos.

perrociego gracias por la felicitación, ya que no lo hace el iniciador del post jajaja

yo estoy acostumbrado a andar al limite de los recursos por eso siempre pienso en optimizar, el tema de que efectivamente se vuelve menos elegante i menos legible, se puede solucionar con unos buenos comentarios a parte de evidentemente un correcto tabulado

Hola buenas antes de todo agradecer a este foro por su ayuda y sus extensos foros , yo tengo el mismo problema que menciona el amigo "AlexPocholo"necesito mostrar en un display sumas de millones, las cuales estén separadas correctamente por comas o puntos, y las elevadas cifras de ceros de los millones no amontonen la vision del lcd...

http://forum.arduino.cc/index.php?action=dlattach;topic=300069.0;attach=114105;image

Un saludo y desde ya gracias! Estaré atento al foro :D

Y porque no usas la solución planteada? Recuerda usar tags cuando pongas imagenes, links o códigos. Tu imagen debe verse asi

noter: Prueba algo así:

  char buffer[15];
  unsigned long numero = 35000000;
  sprintf(buffer, "%02d,%03d,%03d", numero / 1000000, (numero%1000000)/1000, numero%1000);
  Serial.print(buffer);

perdonad por no haber contestado, pense que no se habia subido el hilo. Acabo de probar eso y no consigo nada, siguen viendose los numeros seguidos sin estar separados :(

Pon tu código y lo revisamos.

GO_zalo: Lo tendria que comprobar, pero me parece mucho mas rápido para el procesador hacer

sprintf(buffer, "%d", numero);

Y luego recorrer el buffer del revés (desde las unidades), y cada tres caracteres intercalar un '.' pasándolo todo al buffer final.

no tengo el compilador aqui y el compilador online no me funciona así que no lo puedo probar

No entiendo muy bien lo que me dices, nunca he usado buffer

noter:
Pon tu código y lo revisamos.

Aquí tenéis, espero que podamos sacarle solución. Es lo único que me falta para acabar.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

long contador = 0;
long cuenta = 0;
long palabra = 0;
long alex = 0;
long rampa = 0;
long giros = 0;
long sixuno = 0;
long sixdos = 0;
long sixtres = 0;
long calavera = 0;
long supercombo = 0;






int pinA0 = A0;
int pinA1 = A0;
int pinA2 = A2;
int pinA3 = A3;
int pinA4 = A4;
int pinA5 = A5;
int led = 0;
int led1 = 1;
int led6 = 6;
int led7 = 7;
int pin8 = 8;
int led9 = 9;
int pin10 = 10;
int pin13 = 13;

void setup()
{
  
  
  pinMode(A0, INPUT); //altavoz
  pinMode(A1, INPUT); //altavoz
  pinMode(A2, OUTPUT); //DIANAS VERDES
  pinMode(A3, OUTPUT); //DIANAS ROJAS
  pinMode(A4, OUTPUT);//RAMPA SECUNDARIA
  pinMode(A5, OUTPUT); //RESET
  pinMode(led, OUTPUT); //LED JACKPOT
  pinMode(led1, OUTPUT); //LED CALAVERA
  pinMode(led6, OUTPUT); 
  pinMode(led7, OUTPUT); 
  pinMode(pin8, OUTPUT); //COMBO 1
  pinMode(led9, OUTPUT); 
  pinMode(pin10, OUTPUT);  //COMBO 2
  pinMode(pin13, OUTPUT); //RAMPA PRINCIPAL
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
   lcd.print(" METAL  PINBALL");
   tone (A0, 1000, 100);
   delay(100);
   tone (A1, 500, 400);
   delay(400);
   tone (A0, 700, 400);
   delay(400);
   tone (A1, 1400, 400);
   delay(400);
  


  
  
}

  

void loop()
{
  
 
digitalWrite(led, HIGH);
digitalWrite(led1, HIGH);
digitalWrite(led6, HIGH);
digitalWrite(led7, HIGH);
digitalWrite(led9, HIGH);
  
 lcd.setCursor(0, 1);
 lcd.print(contador);
 
 
 //----------------------------------------------------------------------------------------------------
 //----------------------------------------------------------------------------------------------------
 //----------------------------------------------------------------------------------------------------
 //----------------------------------------------------------------------------------------------------

  
 
 
 
 if (digitalRead (A5) ==HIGH) //RESET
{
if (contador<100)
{
  lcd.setCursor(0, 0);
  lcd.print("                                       ");
  lcd.setCursor(0, 0);
  lcd.print(" MUCHAS GRACIAS ");
 
 
  tone(A0, 293.66, 450);
  delay(450);
  tone(A1, 440.00, 250);
  delay(250);
  tone(A0, 293.66, 250);
  delay(250);
  tone(A1, 293.66, 400);
  delay(400);
  tone(A0, 440.00, 300);
  delay(300);
  tone(A1, 293.66, 350);
  delay(350);
  tone(A0, 349.23, 300);
  delay(300);
  tone(A1, 392.00, 350);
  delay(350);
  tone(A0, 349.23, 300);
  delay(300);
  tone(A1, 392.00, 350);
  delay(350);
  /*
  tone(pin7, 329.63, 300);
  delay(300);
  tone(pin13, 392.00, 300);
  delay(300);
  tone(pin7, 329.63, 400);
  delay(400);*/
  
  
  
  
  
  lcd.setCursor(0, 0);
  lcd.print(" METAL  PINBALL ");  
  
}
}


//----------------------------------------------------------------------------------------------------

  if (digitalRead (A5) ==HIGH) //RESET
{
if (contador>100)
  {
    tone(A0, 1500, 200);
    delay(200);
    tone(A1, 1800, 200);
    delay(200);
    contador =0;
    cuenta =0;
    palabra =0;
    alex =0;
    giros =0;
    rampa =0;
    
    lcd.setCursor(0, 1);
    lcd.print("                                    ");
    lcd.setCursor(0, 0);
    lcd.print("                                 ");
    
   
   lcd.setCursor(2, 0);
   lcd.print("R");
   delay(150);
   lcd.setCursor(3, 0);
   lcd.print("E");
   delay(150);
   lcd.setCursor(4, 0);
   lcd.print("S");
   delay(150);
   lcd.setCursor(5, 0);
   lcd.print("E");
   delay(150);
   lcd.setCursor(6, 0);
   lcd.print("T");
   delay(150);
   lcd.setCursor(7, 0);
   lcd.print("E");
   delay(150);
   lcd.setCursor(8, 0);
   lcd.print("A");
   delay(150);
   lcd.setCursor(9, 0);
   lcd.print("N");
   delay(150);
   lcd.setCursor(10, 0);
   lcd.print("D");
   delay(150);
   lcd.setCursor(11, 0);
   lcd.print("O");
   delay(150);
   lcd.setCursor(12, 0);
   lcd.print(".");
   delay(150);
   lcd.setCursor(13, 0);
   lcd.print(".");
   delay(150);
   lcd.setCursor(14, 0);
   lcd.print(".");
   delay(150);
   lcd.setCursor(2, 0);
   lcd.print("                       ");
   delay(150);
   lcd.setCursor(2, 0);
   lcd.print("RESETEANDO");
   tone(A0, 1340, 200);
   delay(200);
   lcd.setCursor(2, 0);
   lcd.print("                       ");
   delay(200);
   lcd.setCursor(2, 0);
   lcd.print("RESETEANDO");
   tone(A1, 1600, 200);
   delay(200);
   
   
   lcd.setCursor(0, 0);
   lcd.print(" METAL  PINBALL ");
   
   
   
   
    tone(A0, 43.066406, 10);
   delay(10);
   tone(A1, 86.132813, 10);
   delay(10);
   tone(A0, 129.199219, 10);
   delay(10);
   tone(A1, 172.265625, 10);
   delay(10);
   tone(A0, 215.332031, 10);
   delay(10);
   tone(A1, 301.464844, 10);
   delay(10);
   tone(A0, 344.531250, 10);
   delay(10);
   tone(A1, 387.597656, 10);
   delay(10);
   tone(A0, 430.664063, 10);
   delay(10);
   tone(A1, 473.730469, 10);
   delay(10);
   tone(A0, 516.796875, 10);
   delay(10);
   tone(A1, 559.863281, 10);
   delay(10);
   tone(A0, 602.929688, 10);
   delay(10);
   tone(A1, 645.996094, 10);
   delay(10);
   tone(A0, 689.062500, 10);
   delay(10);
   tone(A1, 732.128906, 10);
   delay(10);
   
   
   
 }
 
}

//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------


 if (digitalRead (13)==HIGH) //RAMPA PRINCIPAL
 {
   contador=contador+1000;
   tone(A1, 86.132813, 10);
   delay(10);
   tone(A0, 172, 10);
   delay(10);
   tone(A1, 258, 10);
   delay(10);
   tone(A0, 344, 10);
   delay(10);
   tone(A1, 430, 10);
   delay(10);
   tone(A0, 516, 10);
   delay(10);
   tone(A1, 602, 10);
   delay(10);
   tone(A0, 689, 10);
   delay(10);
   tone(A1, 775, 10);
   delay(10);
   tone(A0, 861, 10);
   delay(10);
   tone(A1, 947, 10);
   delay(10);
   tone(A0, 1033, 10);
   delay(10);
   tone(A1, 1119, 10);
   delay(10);
   tone(A0, 1205, 10);
   delay(10);
   tone(A1, 1291, 10);
   delay(10);
   tone(A0, 1378, 10);
   delay(10);
   tone(A1, 1464, 10);
   delay(10);
   tone(A0, 1550, 10);
   delay(10);
   lcd.setCursor(0, 1);
   lcd.print(contador);
   lcd.setCursor(0, 0);
   lcd.print("                               ");
   lcd.setCursor(0, 0);
   lcd.print(" METAL  PINBALL ");
   giros=0;

No me cabe el codigo entero, he puesto solo una pequeña parte

Veo que no te has aclarado mucho de qué iba el código que puse ::) . Con sprintf lo que hago es escribir los caracteres en una cadena en memoria. Esa cadena es la que luego mostramos por serial o por lcd. Debes sustituir un par de cosillas para adaptarlo a lo tuyo. Donde has puesto lcd.print(contador) deberías poner

  char buffer[15];
  sprintf(buffer, "%02d,%03d,%03d", contador / 1000000, (contador%1000000)/1000, contador%1000);
  lcd.print(buffer);

noter: Veo que no te has aclarado mucho de qué iba el código que puse ::) . Con sprintf lo que hago es escribir los caracteres en una cadena en memoria. Esa cadena es la que luego mostramos por serial o por lcd. Debes sustituir un par de cosillas para adaptarlo a lo tuyo. Donde has puesto lcd.print(contador) deberías poner

  char buffer[15];
  sprintf(buffer, "%02d,%03d,%03d", contador / 1000000, (contador%1000000)/1000, contador%1000);
  lcd.print(buffer);

Vale, algo he avanzado con esto, pero no me funciona muy bien. ¿Deberia de poner eso en todos los lcd.print(contador) que tenga? Es decir, borrar lcd.print(contador) y poner eso.

Sí. Aunque otra opción, es meter esos comandos en una función (por ejemplo imprimepuntuacion()) y sustituir todos los lcd.print(contador) por imprimepuntuacion(). Si además del contador estás pintando el resto de la pantalla de la misma forma siempre, puedes incluir en la función los demás pasos del pintado en una función pintarpantalla() que haga todo, en lugar de repetir los mismos pasos una y otra vez.

noter: Sí. Aunque otra opción, es meter esos comandos en una función (por ejemplo imprimepuntuacion()) y sustituir todos los lcd.print(contador) por imprimepuntuacion(). Si además del contador estás pintando el resto de la pantalla de la misma forma siempre, puedes incluir en la función los demás pasos del pintado en una función pintarpantalla() que haga todo, en lugar de repetir los mismos pasos una y otra vez.

Ya he conseguido avanzar, me llega perfectamente a 999,000 con su coma y tal. Hasta ahi perfecto. A la hora de pasar al millón se me queda así "1000,000" ¿que puedo hacer para que se quede así "1,000,000"?

lo que he usado para ello ha sido lo que me pusiste de sprintf y buffer, he puesto esto:

char buffer[15];
  sprintf(buffer, "%01d,%03d", contador / 1000, (contador%1000)/1000);
  lcd.print(buffer);[code]

[/code]

AlexPocholo: Ya he conseguido avanzar, me llega perfectamente a 999,000 con su coma y tal. Hasta ahi perfecto. A la hora de pasar al millón se me queda así "1000,000" ¿que puedo hacer para que se quede así "1,000,000"?

lo que he usado para ello ha sido lo que me pusiste de sprintf y buffer, he puesto esto:

char buffer[15];
  sprintf(buffer, "%01d,%03d", contador / 1000, (contador%1000)/1000);
  lcd.print(buffer);[code]

[/code]

y te ha funcionado Alex?

Este tema no esta repetido? tengo la impresión de haberlo leído y contestarlo hace poco, pero no veo mi comentario. ¿sera un deja vu?

No me compila el código, creo que esta incompleto, oh ya hice que compilara, faltan dos corchetes de cierre al final, pero no lo entiendo.

Saludos.
Probé

sprintf(buffer, "%01d,%03d", contador / 1000, (contador%1000)/1000);

Y no me gusto como me presentan los datos.

Asi que hice mi mejor tiro con esta funcion:

void imprime_LCD(unsigned long valor,byte linea){
  char buffer[16];
  bool coma = false;
  lcd.setCursor(0, linea);
  dtostrf(valor, 13, 0, buffer);
  for(int i = 0; i < 13; i++){
    if(buffer[i]!=' ') coma = true;
      lcd.print(buffer[i]);
      if((i==3 || i==6 || i==9)){
        if(coma)lcd.print(",");
        else lcd.print(" ");
      }
  }
}

Hay que crear lcd y llamar a la función con:

imprime_LCD(valor,linea_a_mostrar);

No se si tu libreria soporte lcd.setCursor pero si no la cambias a tu gusto.

Yo la Probé con estas lineas:

	unsigned long tiempo = millis()*millis(); 
	imprime_LCD(tiempo,1);

AlexPocholo: Ya he conseguido avanzar, me llega perfectamente a 999,000 con su coma y tal. Hasta ahi perfecto. A la hora de pasar al millón se me queda así "1000,000" ¿que puedo hacer para que se quede así "1,000,000"?

lo que he usado para ello ha sido lo que me pusiste de sprintf y buffer, he puesto esto:

char buffer[15];
  sprintf(buffer, "%01d,%03d", contador / 1000, (contador%1000)/1000);
  lcd.print(buffer);[code]

[/code]

Claro. Es que el código que puse yo no era ese, sino

  sprintf(buffer, "%02d,%03d,%03d", contador / 1000000, (contador%1000000)/1000, contador%1000);

El resultado debería ser que te imprima las puntuaciones siempre así

00,000,123

ehrja: y te ha funcionado Alex?

Este tema no esta repetido? tengo la impresión de haberlo leído y contestarlo hace poco, pero no veo mi comentario. ¿sera un deja vu?

Si, me funciona perfectamente, pero solo hasta "999,000". Puede ser que se repitiese el el tema, porque tuve un problemilla y le di a subirlo varias veces y al final parece que se ha subido dos veces... lo siento