1000er Punkt

Hallo,

ist es möglich an einem 128x64 OLED bei long int Werten jede dritte Stelle mit einem Punkt zu kennzeichnen um die Lesbarkeit der Zahlen zu erhöhen? Z.B. 1.000.000
Für einen Tip wäre ich sehr dankbar.

Tschüß
Lokgeist

Moin, ja je nach zu erwartendem Wertebereich: die richtige Zahl durch 1000000 teilen und den ganzzahligen Anteil schreiben danach einen Punkt schreiben von der richtigen Zahl den ganzzahligen Anteil * 1000000 abziehen den Rest durch 1000 teilen und den ganzzahligen Anteil schreiben danach einen Punkt schreiben von dem obigen Rest den ganzzahligen Anteil * 1000 abziehen den Rest schreiben fertig

Beispiel: 23625364

23625364 / 1000000 = 23,625364 23625364 - (23 * 1000000) = 625364 625364 / 1000 = 625,364 625364 - (625 * 1000) = 364 Ausgabe 23.625.364

Gruss Kurti

Ähh, das hat ja erst mal nix mit der Art des Displays zu tun :-\

Und es ist Dir natürlich auch zugestanden, Dir eine Funktion zu basteln die genau das tut was Du möchtest. Übergib also eine Zahl als Long, zähle die Stellen, teile von rechts kommend in 3er Blöcke auf, setze dazwischen Dein gewünschtes Trennzeichen und ab damit auf's Display.

Reicht das als Tipp?

Hallo,

danke für die Tips. Aber das sieht ja nach einem richtigen eigenen Programm aus. Ich dachte man könne es einfach mit einem Ausdruck oder ähnlichem ausführen. Ich müsste die Zahlen dann ja wohl erst mal in float umwandeln wegen der Kommastellen. Das ist dann wohl noch nichts für einen Neuling. Aber trotzdem recht herzlichen Dank.

Tschüß Lokgeist

Das ist nur eine Funktion. Kein Programm :slight_smile:

Und nix mit Float. Die Nachkommastellen fallen ja weg. Dich interessieren nur die Stellen vor dem Komma. Also reicht eine Integer-Division.

Hallo, wenn Du die Zahlen nicht umwandelst, hast Du automatisch den ganzzahligen Anteil. Das Beispiel ist doch schon fast ein Programm. Nur noch einige Variablennamen einfügen und fertig. Am Besten erstmal mit einer kleineren Zahl testen. z.B. 1234 ausgeben als 1.234

Gruss Kurti

Bei manchen Sachen muss man aber schon aufpassen. Also wenn 0 rauskommt muss man 3 Nullen ausgeben

Serenifly: Bei manchen Sachen muss man aber schon aufpassen. Also wenn 0 rauskommt muss man 3 Nullen ausgeben

Hallo, guter Einwand, das Problem hatte ich noch nicht erkannt. Man muss dafür sorgen, dass nach jedem Punkt drei Stellen ausgegeben werden.

Das wäre mir erst beim Testen aufgefallen.

Gruss Kurti

Ich habe mit dem Nachdenken vor Kurti #1 angefangen und bin daher auf einen etwas anderen Ansatz gekommen:

void setup() {
  Serial.begin(9600);
  anzeige(1234567890L);
  anzeige(-1234567890L);
  anzeige(123456789L);
  anzeige(-123456789L);
  anzeige(12345678L);
  anzeige(-12345678L);
  anzeige(1234567L);
  anzeige(-1234567L);
  anzeige(123456L);
  anzeige(-123456L);
  anzeige(12345L);
  anzeige(-12345L);
  anzeige(1234L);
  anzeige(-1234L);
  anzeige(123L);
  anzeige(-123L);
  anzeige(12L);
  anzeige(-12L);
  anzeige(1L);
  anzeige(-1L);
  anzeige(0L);
}


void loop() {
}

void anzeige(long wert) {
  char buf[20];
  ltoa(wert, buf, 10);
  byte i = 0;
  while (buf[i] != '\0') {
    i++;
  }
  byte laenge = i - 1;
  byte komma;
  if (wert<0){komma = (laenge-1) / 3;} else {komma = laenge / 3;}
  buf[laenge + komma + 1] = '\0';
  byte j = 3;
  for (i = laenge + komma; i > 0; i--) {
    if (j == 0) {
      buf[i] = '.';
      j = 3;
    } else {
      buf[i] = buf[laenge];
      j--;
      laenge--;
    }
  }


  Serial.print("wert    = "); Serial.println(wert); // Debug-Ausgabe
  Serial.print("Ausgabe = "); Serial.println(buf); // Debug-Ausgabe
  Serial.println("******************************");       // Debug-Ausgabe
}

Lokgeist:
danke für die Tips. Aber das sieht ja nach einem richtigen eigenen Programm aus. Ich dachte man könne es einfach mit einem Ausdruck oder ähnlichem ausführen.

Was Du dafür brauchst, wäre eine “Funktion”, die Du Dir selberschreiben müßtest, weil es die fertig nicht gibt.

Ich haue dann mal so eine Funktion raus, mit einem kleinen Testprogramm:

char* ltoaKomma(long i)
{ // format long variable with thousands seperator '.'
#define LONG_MAXWIDTH 14  // −2.147.483.648 = 10 digits + sign + 3 dots
  static char buf[LONG_MAXWIDTH + 1];  // Room for formatted number  and '\0'
  char *p = buf + LONG_MAXWIDTH;       // points to terminating '\0'
  if (i<0) 
  {
    buf[0]='-'; 
    i=-i;
  }
  else buf[0]='+';
  byte count=3;
  do 
  {
      *--p = '0' + (i % 10);
      i /= 10;
      count--;
      if (count==0 && i>0)
      {
        *--p = '.';
        count=3;
      }
  } while (i!=0);
  if (buf[0]=='-') *--p = '-';
  return p;
}


void setup()
{
  Serial.begin(9600);
  Serial.println(ltoaKomma(0));
  Serial.println(ltoaKomma(2));
  Serial.println(ltoaKomma(234));
  Serial.println(ltoaKomma(2345));
  Serial.println(ltoaKomma(23456));
  Serial.println(ltoaKomma(234567));
  Serial.println(ltoaKomma(2345678));
  Serial.println(ltoaKomma(-2));
  Serial.println(ltoaKomma(-234));
  Serial.println(ltoaKomma(-2345));
  Serial.println(ltoaKomma(-23456));
  Serial.println(ltoaKomma(-234567));
  Serial.println(ltoaKomma(-2345678));
}

void loop()
{
}

In Anlehnung an die Standard-Libraryfunktion “ltoa” (für “long-to-array”) habe ich die Funktion “ltoaKomma” genannt. Aber kannst Du bei Dir natürlich nennen wie Du lustig bist.

Viel Spaß damit!

kurti: Moin, ja je nach zu erwartendem Wertebereich: die richtige Zahl durch 1000000 teilen und den ganzzahligen Anteil schreiben danach einen Punkt schreiben von der richtigen Zahl den ganzzahligen Anteil * 1000000 abziehen den Rest durch 1000 teilen und den ganzzahligen Anteil schreiben danach einen Punkt schreiben von dem obigen Rest den ganzzahligen Anteil * 1000 abziehen den Rest schreiben fertig

Beispiel: 23625364

23625364 / 1000000 = 23,625364 23625364 - (23 * 1000000) = 625364 625364 / 1000 = 625,364 625364 - (625 * 1000) = 364 Ausgabe 23.625.364

Gruss Kurti

Es gibt den Operator % der den Rest einer Division zurückgibt.

23625364 - (23 * 1000000) = 625364 wird zu 23625364 % 1000000 = 625364

Grüße Uwe

Hallo und guten morgen.

Hallo jurs, mit deiner “rausgehauenen” Fuktion klappt es prima.
Habe recht herzlichen Dank.

Hallo agmue, mit deiner Fuktion komme ich nicht zurecht. Irgend wie stelle ich mich zu dusselig an.
long x = 999990
void loop()
{
for (x;x <= 1000010; x++);
{
Serial.println(anzeige(x));
}
delay(50000);
}
bist du bitte so gut und verbesserst meine Schleife.

Einstweilen mal ein recht herzliches Dankeschön
Der Lokgeist

Hallo, gerne, beispielsweise so:

long x = 999990;

void loop() {
  for (x; x <= 1000010; x++)
  {
    anzeige(x);
  }
}

Bei jurs wird mit char* ltoaKomma(long i) ein Rückgabewert (ein Zeiger) generiert, es ist also eine “Funktion”. Ich dagegen habe ein Unterprogramm ohne Rückgabewert (void) geschrieben, das die Ausgabe mittels Serial.println() schon enthält, daher auch der Name “anzeige”. Du müßtest dann Serial.println() durch den entsprechenden Aufruf Deiner Bibliothek für das Display ersetzen.

Hätte ich gewußt, jurs schreibt eine Funktion, hätte ich mich mit meinem Anfängercode nicht gemeldet. Ich war eine Minute zu früh. Mein Code hat nur einen einzigen Vorteil: ich verstehe ihn :slight_smile:

Mein Tipp, nimm den Code von jurs, der ist bestimmt besser!

EDIT: Die for-Schleife wird nur einmal durchlaufen, da x als Anfangswert verändert wird. delay() ist also nicht notwendig.

uwefed: Es gibt den Operator % der den Rest einer Division zurückgibt.

23625364 - (23 * 1000000) = 625364 wird zu 23625364 % 1000000 = 625364

Grüße Uwe

Hallo Uwe, das Beispiel sollte kein Programm sein, auch kein Pseudocode. Es sollte nur das gestammelte Geschreibsel erläutern.

Gruss Kurti

Hallo agmue,

vielen besten Dank. Nun bin ich endlich dazu gekommen auch deine Version bei mir zu testen. Alles Bestens. :)

Tschüß Der Lokgeist

PS. Es ist toll wie einem hier immer wieder geholfen wird. Allen sei Dank die hier unermüdlich immer tätig sind.