Go Down

Topic: Separar números por decenas, centenas, millares...etc (Read 11636 times) previous topic - next topic

ehrja

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:

Code: [Select]
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?
Hola buenos días!

ehrja

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.
Hola buenos días!

max_saeta

#17
Feb 28, 2015, 08:55 pm Last Edit: Feb 28, 2015, 08:59 pm by max_saeta
Saludos.
Probé 

Code: [Select]

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:

Code: [Select]
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:
Code: [Select]
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:

Code: [Select]
unsigned long tiempo = millis()*millis();
imprime_LCD(tiempo,1);

noter

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:

Code: [Select]
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
Code: [Select]

  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

AlexPocholo

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

AlexPocholo

#20
Mar 01, 2015, 01:28 am Last Edit: Mar 01, 2015, 01:33 am by AlexPocholo
Claro. Es que el código que puse yo no era ese, sino
Code: [Select]

  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
Ya, pero yo he probado ese que me pusiste y no es exactamente lo que busco. Porque ponia que diese 1000 puntos y en el lcd me salia "00,000,001" y por eso tuve que borrar unas cuantas cosas y ahora asciende perfectamente desde "0,000" hasta "999,000" perfectamente, solo que cuando pasa al millon se me queda en "1000,000" y yo quiero "1,000,000". La cosa es que me pongo a sumarle un millon y me lo pone genial "01,000,000" y asciende perfectamente, pero a la hora de sumar 1000 puntos nada... no se queda ni si quiera asi "00,001,000" No entiendo porque... pf

max_saeta

AlexPocholo
Prueba la rutina que te coloque y me comentas.

ehrja

Esto es otra forma de hacerlo, creo que es mas clara aunque un poco mas complicada, peor igual te sirve para que te des una idea.

Código para pantalla lcd i2c:

Code: [Select]
//ehrja 28/02/2015
//codigo que incrementa un numero y lo imprime en pantalla lcd por millares.
//liga del foro http://forum.arduino.cc/index.php?topic=300069.0
//Referencia
//Separador de millares
//http://es.wikipedia.org/wiki/Separador_de_millares

#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#define coma lcd.print(",")              //comodín para imprimir la coma
#define centenas(a) (a%1000)             //calcula las centenas del número a
#define miles(a) (a/1000)                //calcula los miles que hay en el número a
#define millones(a) (miles(miles(a)))    //calcula los millones que hay en el número a

 

LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

unsigned long lastMillis;      //utilizada para actualizar los puntos en el LCD
unsigned long puntos;          //Variable en donde se acumulan los puntos
unsigned long temp;            //Variable temporal funciona igual que lastMillis
int temp2;                     //Variable temporal usada en el similador de puntos

void setup() {
  lcd.begin(16, 02);                              //iniciamos LCD
  lcd.clear();                                    //limpia LCD
  lcd.print("Separador de millares");             //imprime en la primera linea
 }

void loop() {
//**************************************************************************
  //rutina que actualiza el puntaje en pantalla
  while (millis() - lastMillis >= 100)           //pasa cada 100ms, se puede ajustar
  { lastMillis = millis();
    lcd.setCursor(5, 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(centenas(puntos));
   
    if (puntos < 1000000000 && puntos > 999999)  //imprime # < 1000000000 y > 1000000
      lcd.print(millones(puntos)), coma, lcd.print(centenas(miles(puntos))), coma, lcd.print(centenas(puntos));
  //solo hay un problema aquí cuando los miles son menores a 10, el numero se corre dos dígitos

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

//****************************************************************************
  //sumas de puntos, ignora esta parte, es solo un emulador de las jugadas
  while (millis() - temp >= 100) // pasa cada 100ms, se puede ajustar
  { temp = millis();
    temp2 = random(100, 800);          //puntos random de entre 100 a 800
    temp2 = temp2 - (temp2 % 100) ;    //solo 100,200,300,400,500,600,800
    puntos = puntos + temp2;           //suma los puntos...

  }
//****************************************************************************
}


Código para tu pantalla:
Code: [Select]
//ehrja 28/02/2015
//codigo que incrementa un numero y lo imprime en pantalla lcd por millares.
//liga del foro http://forum.arduino.cc/index.php?topic=300069.0
//Referencia
//Separador de millares
//http://es.wikipedia.org/wiki/Separador_de_millares

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define coma lcd.print(",")              //comodin para imprimir la coma
#define centenas(a) (a%1000)             //calcula las centenas del número a
#define miles(a) (a/1000)                //calcula los miles que hay en el número a
#define millones(a) (miles(miles(a)))    //calcula los millones que hay en el número a

unsigned long lastMillis;      //utilizada para actualizar los puntos en el LCD
unsigned long puntos;          //Variable en donde se acumulan los puntos
unsigned long temp;            //Variable temporal funciona igual que lastMillis
int temp2;                     //Variable temporal usada en el similador de puntos

void setup() {
  lcd.begin(16, 02);                              //iniciamos LCD
  lcd.clear();                                    //limpia LCD
  lcd.print("Separador de millares");             //imprime en la primera linea
 }

void loop() {
//**************************************************************************
  //rutina que actualiza el puntaje en pantalla
  while (millis() - lastMillis >= 100)           //pasa cada 100ms, se puede ajustar
  { lastMillis = millis();
    lcd.setCursor(5, 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(centenas(puntos));
   
    if (puntos < 1000000000 && puntos > 999999)  //imprime # < 1000000000 y > 1000000
      lcd.print(millones(puntos)), coma, lcd.print(centenas(miles(puntos))), coma, lcd.print(centenas(puntos));
  //solo hay un problema aquí cuando los miles son menores a 10, el numero se corre dos dígitos

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

//****************************************************************************
  //sumas de puntos, ignora esta parte, es solo un emulador de las jugadas
  while (millis() - temp >= 100) // pasa cada 100ms, se puede ajustar
  { temp = millis();
    temp2 = random(100, 800);          //puntos random de entre 100 a 800
    temp2 = temp2 - (temp2 % 100) ;    //solo 100,200,300,400,500,600,800
    puntos = puntos + temp2;           //suma los puntos...

  }
//****************************************************************************
}
Hola buenos días!

AlexPocholo

Esto es otra forma de hacerlo, creo que es mas clara aunque un poco mas complicada, peor igual te sirve para que te des una idea.

Código para pantalla lcd i2c:

Code: [Select]
//ehrja 28/02/2015
//codigo que incrementa un numero y lo imprime en pantalla lcd por millares.
//liga del foro http://forum.arduino.cc/index.php?topic=300069.0
//Referencia
//Separador de millares
//http://es.wikipedia.org/wiki/Separador_de_millares

#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#define coma lcd.print(",")              //comodín para imprimir la coma
#define centenas(a) (a%1000)             //calcula las centenas del número a
#define miles(a) (a/1000)                //calcula los miles que hay en el número a
#define millones(a) (miles(miles(a)))    //calcula los millones que hay en el número a

 

LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

unsigned long lastMillis;      //utilizada para actualizar los puntos en el LCD
unsigned long puntos;          //Variable en donde se acumulan los puntos
unsigned long temp;            //Variable temporal funciona igual que lastMillis
int temp2;                     //Variable temporal usada en el similador de puntos

void setup() {
  lcd.begin(16, 02);                              //iniciamos LCD
  lcd.clear();                                    //limpia LCD
  lcd.print("Separador de millares");             //imprime en la primera linea
 }

void loop() {
//**************************************************************************
  //rutina que actualiza el puntaje en pantalla
  while (millis() - lastMillis >= 100)           //pasa cada 100ms, se puede ajustar
  { lastMillis = millis();
    lcd.setCursor(5, 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(centenas(puntos));
   
    if (puntos < 1000000000 && puntos > 999999)  //imprime # < 1000000000 y > 1000000
      lcd.print(millones(puntos)), coma, lcd.print(centenas(miles(puntos))), coma, lcd.print(centenas(puntos));
  //solo hay un problema aquí cuando los miles son menores a 10, el numero se corre dos dígitos

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

//****************************************************************************
  //sumas de puntos, ignora esta parte, es solo un emulador de las jugadas
  while (millis() - temp >= 100) // pasa cada 100ms, se puede ajustar
  { temp = millis();
    temp2 = random(100, 800);          //puntos random de entre 100 a 800
    temp2 = temp2 - (temp2 % 100) ;    //solo 100,200,300,400,500,600,800
    puntos = puntos + temp2;           //suma los puntos...

  }
//****************************************************************************
}


Código para tu pantalla:
Code: [Select]
//ehrja 28/02/2015
//codigo que incrementa un numero y lo imprime en pantalla lcd por millares.
//liga del foro http://forum.arduino.cc/index.php?topic=300069.0
//Referencia
//Separador de millares
//http://es.wikipedia.org/wiki/Separador_de_millares

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define coma lcd.print(",")              //comodin para imprimir la coma
#define centenas(a) (a%1000)             //calcula las centenas del número a
#define miles(a) (a/1000)                //calcula los miles que hay en el número a
#define millones(a) (miles(miles(a)))    //calcula los millones que hay en el número a

unsigned long lastMillis;      //utilizada para actualizar los puntos en el LCD
unsigned long puntos;          //Variable en donde se acumulan los puntos
unsigned long temp;            //Variable temporal funciona igual que lastMillis
int temp2;                     //Variable temporal usada en el similador de puntos

void setup() {
  lcd.begin(16, 02);                              //iniciamos LCD
  lcd.clear();                                    //limpia LCD
  lcd.print("Separador de millares");             //imprime en la primera linea
 }

void loop() {
//**************************************************************************
  //rutina que actualiza el puntaje en pantalla
  while (millis() - lastMillis >= 100)           //pasa cada 100ms, se puede ajustar
  { lastMillis = millis();
    lcd.setCursor(5, 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(centenas(puntos));
   
    if (puntos < 1000000000 && puntos > 999999)  //imprime # < 1000000000 y > 1000000
      lcd.print(millones(puntos)), coma, lcd.print(centenas(miles(puntos))), coma, lcd.print(centenas(puntos));
  //solo hay un problema aquí cuando los miles son menores a 10, el numero se corre dos dígitos

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

//****************************************************************************
  //sumas de puntos, ignora esta parte, es solo un emulador de las jugadas
  while (millis() - temp >= 100) // pasa cada 100ms, se puede ajustar
  { temp = millis();
    temp2 = random(100, 800);          //puntos random de entre 100 a 800
    temp2 = temp2 - (temp2 % 100) ;    //solo 100,200,300,400,500,600,800
    puntos = puntos + temp2;           //suma los puntos...

  }
//****************************************************************************
}

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!

AlexPocholo

Saludos.
Probé 

Code: [Select]

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:

Code: [Select]
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:
Code: [Select]
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:

Code: [Select]
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

max_saeta

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

Y para usarla debes colocar:

Code: [Select]
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.

ehrja

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.
Hola buenos días!

surbyte

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.


ehrja

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.

Hola buenos días!

surbyte

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
Quote
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.

Go Up