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

max_saeta:
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);

He intentado ponerlo y probarlo, pero me hago un lio... no se donde ponerlo. Si pudieses especificar un poco mas te lo agradecería. Muchas gracias

AlexPocholo este codigo que te pase lo colocas antes de void setup()

Y para usarla debes colocar:

imprime_LCD(valor,1);

donde valor es el numero que vas a imprimir y el 1 después de la coma es la linea donde vas a imprimirla.

AlexPocholo:
Buenas. Lo he probado y en tal que conecto el arduino empieza a contar puntos el solo... y tengo las mismas que con lo que tenia yo, empieza a tirarme digitos a la derecha sin poner comas ni nada se queda asi "38457,000" (es un ejemplo). Alomejor lo he puesto mal... pero creo que no. Yo quiero que me separe los millones también. Muchas gracias por la ayuda!

Si te tomas un poco de tiempo para leer el código que te puse, entenderás que tiene un "emulador" que cuenta puntos, en realidad suma puntos de 100 a 800 en un random, lo puse para emular tu código que cuenta puntos tendrías leerlo y adaptarlo al tuyo.

A mi me funciona bien la separación, el único detalle que tiene es que cuando el contador esta por sobre 1,000,000 (un millón) la parte de los miles se corre dos posiciones a la izquierda cuando es < 10 y una cuando es < 100 , algo que se ve mal pero cuando el numero llega a 1,100,000 recupera su forma.

Se me ocurre una forma de solucionarlo pero te lo dejare a ti si quieres seguir con mi código, te doy una pista, cuando el número sea mayor que 1,000,000 imprimir los millones con dos ceros antes cuando sean menos que 9 y un cero cuando sean menos que 100.

Me puedo reir de la situación que se ha provocado? Provocada por el exceso de ayuda.

Me causa gracia porque le han tirado tantos códigos que AlexPocholo esta completamente perdido.
Dejen que desarrolle alguna idea porque veo que va desde lo de noter, por max y termina con ehrja.
Porque prueba códigos y se atora a cada momento mas.

Ahora tomate tu tiempo y elabora el programa que se adapte a tu gusto, pero intenta poner un poco de tu parte.

Si adelante.
A mi también me parece algo cómico, -escena de un mercado donde todos los vendedores, al unisono, te ofrecen a que compres algo.

Ya sentía que el pobre no sabría para donde mirar con tanta ayuda, en fin se pueden aprovechar todos los aportes para aprender algo y desarrollar una idea como dices.

Si pero también está en nosotros y ya van a decir, Surbyte siempre criticando, en el darse cuenta que si del otro lado una persona tiene conocimiento mínimos no podemos abrumarlo con 3 o 4 alternativas.
Y no es reto, es como tu dices aprendizaje para todos, para el y para nosotros.

Dejen que pueda digerir las sugerenicas.

Yo veo posts en los que algunas personas no devuelven según se les brinda información, y te das cuenta que no avanzan, cuando es asi, no debemos hacerle todo (soy de ese criterio) porque no aprende nada.
Ejemplo de eso fue con el cronómetro descendente que yo le hago todo el programa y no podía agregar un botón.

Aca no se que pasará.
Primero parece estar haciendo un juego, cosa que no es fácil, luego no puede o parece no poder usar una sugerencia de de max o tuya donde le dicen reeplaza solo el loop y veo que se queda atascado entre noter, max y luego llegas tu, jajaja y le tiras otra idea que lo da vuelta completamente y el mismo lo dice

He intentado ponerlo y probarlo, pero me hago un lio... no se donde ponerlo. Si pudieses especificar un poco mas te lo agradecería

Veamos que resuelve pero denle tiempo. Tal vez tenga dudas.. que las comparta pero que avance.

Jejeje si tienes razón me da mucha pena ese tipo de situaciones.

Y no es que te niegue la ayuda pero a veces la necesidad enseña mas, considero que toda la información esta ya escrita en los comentarios que anteceden a estos últimos y si bien algo no esta detallado puedes buscar referencias en google o en las referencias de Arduino.

Como dije antes, la necesidad es la madre de los inventos, si tienes necesidad de que quede bien vas a concretar tu trabajo.

Estas tan cerca! y lo único que puedo decir: "continua, ya estas cerca y veras que se siente una gran satisfacción después de saltar ese gran obstáculo"

La verdad es que si, estoy un poco saturado y liado con los codigos jajajajaja. Voy a ir probando todo lo que pueda y modificando a ver si doy con ello y os informare. Muchas gracias por la ayuda!

ehrja:
Si te tomas un poco de tiempo para leer el código que te puse, entenderás que tiene un "emulador" que cuenta puntos, en realidad suma puntos de 100 a 800 en un random, lo puse para emular tu código que cuenta puntos tendrías leerlo y adaptarlo al tuyo.

A mi me funciona bien la separación, el único detalle que tiene es que cuando el contador esta por sobre 1,000,000 (un millón) la parte de los miles se corre dos posiciones a la izquierda cuando es < 10 y una cuando es < 100 , algo que se ve mal pero cuando el numero llega a 1,100,000 recupera su forma.

Se me ocurre una forma de solucionarlo pero te lo dejare a ti si quieres seguir con mi código, te doy una pista, cuando el número sea mayor que 1,000,000 imprimir los millones con dos ceros antes cuando sean menos que 9 y un cero cuando sean menos que 100.

Vale voy a continuar con este codigo y creo que sera el definitivo. Ahora me va genial, pero la cosa es esa que a veces me pone por ejemplo "1,40,0000" o "1,5,000000" pero como dices tu, al subir a 100 se quita y se pone bien. Estoy calentandome la cabeza para solucionarlo con la pista que me has dado y a ver si lo logro, e intentado algo, pero no ha funcionado. Muchas gracias

Si ya lo dije, el porque pasa y como resolverlo, esta claro, peor lo que no esta claro , al menos para ti, es porque se ven mas ceros al final...

Te di una pista en el comentario #26 para resolver eso.

Pasa porque millones, miles y centenas son números enteros y no tienen ceros a la izquierda, por lo tanto se corren los miles y todo después de ello. Se ven tantos ceros porque la pantalla no se limpia y por eso se ven mas ceros.

si pones lcd.clear(); antes de lcd.setCursor(##,##) te daras cuenta que los números que aparecen son los que deben ser.

ehrja:
Si ya lo dije, el porque pasa y como resolverlo, esta claro, peor lo que no esta claro , al menos para ti, es porque se ven mas ceros al final...

Te di una pista en el comentario #26 para resolver eso.

Pasa porque millones, miles y centenas son números enteros y no tienen ceros a la izquierda, por lo tanto se corren los miles y todo después de ello. Se ven tantos ceros porque la pantalla no se limpia y por eso se ven mas ceros.

si pones lcd.clear(); antes de lcd.setCursor(##,##) te daras cuenta que los números que aparecen son los que deben ser.

Buenas, solucione el problema ese con lcd.clear(); ahora me va genia. Solo hay un problema y es que cuando los miles son menos de 100.000 al estar los puntos en los millones me lo interpreta asi "1,10,000" y cuando son menor de 10.000 asi "1,5,000" he intentando solucionarle intentando ponerle dos ceros cuando sea menos de 10.000 y un cero cuando sea menos de 100.000. Pero me salia una liada gorda en el marcador se ceros... Luego subire el codigo que hice y una foto de lo que me pasa que ahora no puedo. Pero voy genial, si no lo puedo solucionar lo dejaré así aunque voy a luchar por conseguirlo.

//en cuanto a clear()

Te advierto que no es necesario el lcd.clear(), solo lo mencione para que vieras que se corren los ceros y la pantalla mantiene los datos todo el tiempo, para cambiarlos hay que sobre escribir en la posición que es lo que se hace, y si se quiere borrar tenemos que usar el lcd.clear() pero si se abusa de el la pantalla parpadeara demasiado, un efecto que se ve feo y que ademas es redundante(innecesario ya que la mayoria de dígitos son los mismos).

Como solo se actualiza un renglón se vale sobre escribir cada vez y no se ve mal porque solo se nota en los últimos dígitos del número.

//EL FIX

Por otro lado si se ante ponen ceros según el caso ("00" si miles < 10, "0" si miles < 100) no debería de correrse los dígitos y no necesitas el clear, si lo solucionas quita el clear para que no te parpadee demasiado.

Yo tengo listo el código, te lo paso o quieres que te de mas pistas.
Se trata comparaciones compuestas

ehrja:
//en cuanto a clear()

Te advierto que no es necesario el lcd.clear(), solo lo mencione para que vieras que se corren los ceros y la pantalla mantiene los datos todo el tiempo, para cambiarlos hay que sobre escribir en la posición que es lo que se hace, y si se quiere borrar tenemos que usar el lcd.clear() pero si se abusa de el la pantalla parpadeara demasiado, un efecto que se ve feo y que ademas es redundante(innecesario ya que la mayoria de dígitos son los mismos).

Como solo se actualiza un renglón se vale sobre escribir cada vez y no se ve mal porque solo se nota en los últimos dígitos del número.

//EL FIX

Por otro lado si se ante ponen ceros según el caso ("00" si miles < 10, "0" si miles < 100) no debería de correrse los dígitos y no necesitas el clear, si lo solucionas quita el clear para que no te parpadee demasiado.

Yo tengo listo el código, te lo paso o quieres que te de mas pistas.
Se trata comparaciones compuestas

Perdona por no responderte antes. No he conseguido ponerlo como deseo... Si pudieras pasar el código con lo que me falta te lo agradecería mucho, porque estoy ya un poco loco de tanta vuelta jajaja

Hola

Ya me había olvidado de tu caso, pensé que ya lo tenias solucionado...

En fin déjame proponerte algo, te lo paso pero que te parece si pones unas fotos de tu maquina ya terminada o como la tengas a cambio del código, solo por curiosidad y para que valga la pena el esfuerzo y el tiempo de los que te intentamos ayudar por aquí.

Ademas Surbyte me dijo que tenia ganas de verla maquina... jeje

En fin la cuestión es que no andaba tan mal en el comentario #26

    if (puntos < 1000000000 && puntos > 999999)  //imprime # < 1000000000 y > 1000000
    {
      lcd.print(millones(puntos)), coma; 
      int miles = centenas(miles(puntos));
      if (miles<10 && miles >= 0 ) lcd.print("00"), lcd.print(miles);
      if (miles<100 && miles >=10 ) lcd.print("0"), lcd.print(miles);
      if (miles>=100) lcd.print(miles);
      coma, lcd.print(centenas(puntos));
    }
  

    if (puntos > 1000000000000) //mucho tiempo para llegar qui. 
      lcd.clear(), lcd.print("     YA GANASTE ");
}

Bueno amigo esperamos las fotos de tu proyecto, ojala lo tengas bien presentado como debe de ser.
saludos y hasta otra.

Hola amigos del Foro

Muchas gracias antes de todo por la ayuda que se esta prestando en este hilo al amigo "AlexPocholo", el es quien se encarga de la parte eléctrica y de programar el arduino, y yo me encargo del resto de la maquina, desde la idea inicial, construcción, diseño gráfico y un largo etc, ya que crear de 0, totalmente a mano y recreando piezas reales a nivel casero se lleva su tiempo si pero aquí esta...

METALHEAD PINBALL

La maquina es mas pequeña que una de verdad y las piezas son caseras y recreadas con madera, como por ejemplo los FLIPPERS o "palas" si así lo entienden mejor jeje

Esto es todo asta ahora si os gusta el proyecto iremos subiendo algunas fotos mas para que vean como ensamblamos todo lo eléctrico dentro ya del mueble.

Un saludo y nuevamente gracias
Tienen unas partidas aseguradas desde ya! :smiley:

Eso te lo dijo Noter en su primer respuesta...
Ahora vas y vienes con los códigos y de nuevo vuelves a cambiar, cuando yo creía que seguirías el código de ehrja.

A ver si lo entiendes: Lo unico que debes hacer es, establecer que secuencias de números esta fuera del criterio que buscas y para esa secuencia crea una condición que la contemple.

Pues la maquina se ve genial.
Suerte.

Ah no seria mala idea, que si van a continuar con el trabajo lo documenten el el subforo de proyectos con el titulo "maquina de pinball minuatura 'metalera' con arduino", por sugerirles uno.

Las fotos están geniales y la verdad les va quedando bien, me han sorprendido.
buena suerte.

ehrja:
Hola

Ya me había olvidado de tu caso, pensé que ya lo tenias solucionado...

En fin déjame proponerte algo, te lo paso pero que te parece si pones unas fotos de tu maquina ya terminada o como la tengas a cambio del código, solo por curiosidad y para que valga la pena el esfuerzo y el tiempo de los que te intentamos ayudar por aquí.

Ademas Surbyte me dijo que tenia ganas de verla maquina... jeje

En fin la cuestión es que no andaba tan mal en el comentario #26

    if (puntos < 1000000000 && puntos > 999999)  //imprime # < 1000000000 y > 1000000

{
      lcd.print(millones(puntos)), coma;
      int miles = centenas(miles(puntos));
      if (miles<10 && miles >= 0 ) lcd.print("00"), lcd.print(miles);
      if (miles<100 && miles >=10 ) lcd.print("0"), lcd.print(miles);
      if (miles>=100) lcd.print(miles);
      coma, lcd.print(centenas(puntos));
    }

if (puntos > 1000000000000) //mucho tiempo para llegar qui.
      lcd.clear(), lcd.print("    YA GANASTE ");
}




Bueno amigo esperamos las fotos de tu proyecto, ojala lo tengas bien presentado como debe de ser. 
saludos y hasta otra.

Buenas, perdón por no haber contestado antes. Tenia el ordenador roto... lo siento.

He solucionado ya todo el problema que tenia. Le he dado vueltas a ese código y no he conseguido nada... Pero muchísimas gracias por las ayudas y por portaros.

Este ha sido el código que he usado:

[/code]
lcd.setCursor(0, 1); //pasamos a la linea 2

if (puntos < 999) lcd.print(puntos); //imprime # menores a 1000

if (puntos < 1000000 && puntos > 999) //imprime # < 1000000 y > 1000
lcd.print(miles(puntos)), coma, lcd.print("000");

if (puntos < 1000000000 && puntos > 999999){ //imprime # < 1000000000 y > 1000000

if (centenas(miles(puntos)) < 100){

lcd.setCursor(0,1);
lcd.print(millones(puntos)), coma, lcd.print("0"), lcd.print(centenas(miles(puntos))), coma, lcd.print("000");
lcd.setCursor(0,1);
}

if (centenas(miles(puntos)) > 99){

lcd.print(millones(puntos)), coma, lcd.print(centenas(miles(puntos))), coma, lcd.print("000");
}
}
[/code]

ABRIRE UN HILO CUANDO EL PROYECTO ESTE TERMINADO PARA ENSEÑARLO. MUCHAS GRACIAS POR TODO!!

ehrja:
Hola

Ya me había olvidado de tu caso, pensé que ya lo tenias solucionado...

En fin déjame proponerte algo, te lo paso pero que te parece si pones unas fotos de tu maquina ya terminada o como la tengas a cambio del código, solo por curiosidad y para que valga la pena el esfuerzo y el tiempo de los que te intentamos ayudar por aquí.

Ademas Surbyte me dijo que tenia ganas de verla maquina... jeje

En fin la cuestión es que no andaba tan mal en el comentario #26

    if (puntos < 1000000000 && puntos > 999999)  //imprime # < 1000000000 y > 1000000

{
     lcd.print(millones(puntos)), coma;
     int miles = centenas(miles(puntos));
     if (miles<10 && miles >= 0 ) lcd.print("00"), lcd.print(miles);
     if (miles<100 && miles >=10 ) lcd.print("0"), lcd.print(miles);
     if (miles>=100) lcd.print(miles);
     coma, lcd.print(centenas(puntos));
   }

if (puntos > 1000000000000) //mucho tiempo para llegar qui.
     lcd.clear(), lcd.print("     YA GANASTE ");
}




Bueno amigo esperamos las fotos de tu proyecto, ojala lo tengas bien presentado como debe de ser. 
saludos y hasta otra.

Buenas, perdón por no haber contestado antes. Tenia el ordenador roto... lo siento.

He solucionado ya todo el problema que tenia. Le he dado vueltas a ese código y no he conseguido nada... Pero muchísimas gracias por las ayudas y por portaros.

Este ha sido el código que he usado:

lcd.setCursor(0, 1);                         //pasamos a la linea 2 
   
   if (puntos < 999) lcd.print(puntos);         //imprime # menores a 1000
   
   if (puntos < 1000000 && puntos > 999)        //imprime # < 1000000 y > 1000 
     lcd.print(miles(puntos)), coma, lcd.print("000");
   
   if (puntos < 1000000000 && puntos > 999999){  //imprime # < 1000000000 y > 1000000
     
     
    
   if (centenas(miles(puntos)) < 100){
    
    lcd.setCursor(0,1);
   lcd.print(millones(puntos)), coma, lcd.print("0"), lcd.print(centenas(miles(puntos))), coma, lcd.print("000");
   lcd.setCursor(0,1);
   }
   
    if (centenas(miles(puntos)) > 99){
     
    lcd.print(millones(puntos)), coma, lcd.print(centenas(miles(puntos))), coma, lcd.print("000");
   }
   }

ABRIRE UN HILO CUANDO EL PROYECTO ESTE TERMINADO PARA ENSEÑARLO. MUCHAS GRACIAS POR TODO!!