Go Down

Topic: Allineamento caratteri a destra (Read 632 times) previous topic - next topic

steve-cr

Salve. Dovendo spesso organizzare delle schermate LCD su un 20x4 mi trovo spesso a "litigare" con il display perché quando scrivo dei numeri sono, normalmente, allineati a sinistra.
Quindi metto una serie di IF (se >9, se >99, se >999 eccetera) in modo da togliere degli spazi davanti al numero.
Poi c'è la variante col punto decimale. Insomma, mi è venuto il dubbio che forse non so alcune tecniche rapide per allineare un numero a destra e mi è venuto in mente che potrei trasformarlo in string, misurarne la lunghezza e di conseguenza stamparlo nella posizione esatta.
Inoltre c'è il problema di scrivere un numero più corto di quello precedente, quindi cancellare ciò che resta del numero precedente...
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

fabpolli

Credo che la snprintf faccia al caso tuo es:
Code: [Select]

snprintf(STRINGA_DISPLAY, 3, "%03d" , temperatura);
snprintf(STRINGA_DISPLAY, 2, "%02d" , temperatura);
snprintf(STRINGA_DISPLAY, 5, "%3d.%d", int(valore) / 10, int(valore) % 10);



fabpolli

Precisazione (se la funzione è ciò che serve a te):
STRINGA_DISPLAY è un vettore di char lungo quanto ti serve a contenere la stringa che invierai al display, alle volte può essere utile fare una cosa del tipo:
Code: [Select]

char STRINGA_DISPLAY[10];
snprintf(STRINGA_DISPLAY, 3, "Temp: %03d" , temperatura);

e stampare così di nuovo tutto partendo dalla posizione desiderata anche se il più delle volte scritture "chirurgiche" evitano fastidiosi sfarfalii

steve-cr

#3
Dec 06, 2018, 06:49 pm Last Edit: Dec 06, 2018, 06:49 pm by steve-cr
Fabpolli, ti ringrazio molto dell'aiuto, ma forse mi sopravvaluti  :)

Code: [Select]
lcd.setCursor( 0, 0 );
      lcd.print(F( "Watt "));

      if (Power > 999 and Power < 9999) {
        lcd.print (F(" "));
        lcd.print (Power);
      }

      if (Power > 99 and Power < 999) {
        lcd.print (F("  "));
        lcd.print (Power);
      }
      if (Power > 9 and Power < 99) {
        lcd.print (F("   "));
        lcd.print (Power);
      }
      if (Power > 0 and Power < 9) {
        lcd.print (F("    "));
        lcd.print (Power);
      }
      if (Power <= 0) {
        lcd.print (F("    0"));


Io adesso faccio così e tu mi hai dato un metodo che però non voglio applicare senza sapere cosa sto facendo e... senza aver capito cosa fare  :o
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

torn24

Io userei il tuo stesso metodo di valutare il numero e poi stampare gli spazi necessari, però metterei il tutto in una funzione  Spazi(float numero). Il codice risulta pulito, la richiami prima di stampare su lcd.

gpb01

#5
Dec 07, 2018, 07:05 am Last Edit: Dec 07, 2018, 07:05 am by gpb01
Voto per la sprintf()  :D  ...
... una volta che hai capito come funzionano le varie "direttive" è comodissima e semplifica parecchio la costruzione della stringa finale :)

Guglielmo
Search is Your friend ... or I am Your enemy !

torn24

Domanda
Non ho capito come usare la sprintf o snprintf per avere un numero di spazi diversi in base al valore della variabile? Se ad esempio nella stringa formato lascio 3 spazi a sinistra, questi sono fissi, sono sempre 3?
Per cui come fa a lasciare un numero di spazi diversi, esempio se la variabile vale 9 o se la variabile vale 999 ?

gpb01

#7
Dec 07, 2018, 08:08 am Last Edit: Dec 07, 2018, 08:08 am by gpb01
Non lasci spazi, dichiari fin dall'inizio la larghezza del campo numerico e se a sinistra vuoi spazi o zeri ...

Code: [Select]
sprintf(stringa_Destinazione, "Risultato = %6i", variabile_Intera);
Ti meterà in stringa_Destinazione la parola "Risultato = " e poi 6 caratteri rappresentanti il valore di variabile_intera riempita a sinistra con spazi.

Guglielmo
Search is Your friend ... or I am Your enemy !

maubarzi

Guarda questo
Ti spiega come usare printf, quello che ti serve è a pagina 3.

sprintf fa la stessa cosa solo che come primo parametro gli passi il buffer dove andare a scrivere il risultato, occhio che deve essere dimensionato un carattere più grande della stringa che vuoi ottenere per contenere anche il null terminatore.
Nessuna buona azione resterà impunita!

torn24

#9
Dec 07, 2018, 08:34 am Last Edit: Dec 07, 2018, 08:37 am by torn24
Grazie della spiegazione! E del link :)
Ovviamente ho usato sia printf che sprintf, ma nella stringa formato specificavo solo il tipo.

Credo che la spiegazione valga anche per l'autore del thread che non aveva capito  :)

steve-cr

Tutto molto bello e molto chiaro:

Code: [Select]
int age;
age = 25;
printf ( "I am %d years old\n", age );


Mi sfugge solo come passarlo al LCD...
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

steve-cr

Non lasci spazi, dichiari fin dall'inizio la larghezza del campo numerico e se a sinistra vuoi spazi o zeri ...

Code: [Select]
sprintf(stringa_Destinazione, "Risultato = %6i", variabile_Intera);
Ti meterà in stringa_Destinazione la parola "Risultato = " e poi 6 caratteri rappresentanti il valore di variabile_intera riempita a sinistra con spazi.

Guglielmo
Perfetta, questa l'ho capita e provata.
Adesso mi impegno con i decimali. Promesso!
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

maubarzi

Mi sfugge solo come passarlo al LCD...
con sprintf scrivi il risultato sul buffer che hai passato.
Che non è altro che la rappresentazione di una stringa come array di carattari.
Questo lo passi al metodo print dell'lcd.
Avrai istanziato l'lcd usando una qualche libreria e questa avrà implementato sicuramente il metodo print da richiamare.
Nessuna buona azione resterà impunita!

gpb01

Perfetta, questa l'ho capita e provata.
Adesso mi impegno con i decimali. Promesso!
Considera che di "direttive" ne puoi mettere più di una per ogni variabile vuoi venga inserita nella stringa finale e che per i valori con decimali c'è l'apposita "direttiva", quindi non devi fare nulla, fa tutto la sprintf() ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

>maubarzi: ... attento, lui si riferiva ad un'altra cosa:

Code: [Select]
printf ( "I am %d years old\n", age );
... era questo che NON capiva come passare al LCD ... e lo credo :D

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up