StringFormat -- und kein bisschen weise?

  • Guten Abend,

    die Aufgabenstellung ist es Zahlen in beliebiger Größe jedoch innerhalb bestimmter Grenzen (z.B. max 10 Zeichen lang) rechtsbündig auzugeben.

    Ich wollte das mit StringFormat machen, trotz der quälenden Syntax. Nun komme ich bis hierher:

    ;test

    $Var1 = 12345678901234567890.00

    $Var2 = 9.00

    MsgBox(0, "", "S" & StringFormat( "%030.2f", $Var1) & @CRLF & "S" & StringFormat( "%030.72", $Var2) )

    MsgBox(0, "", "S" & StringFormat( "%30.2f", $Var1) & @CRLF & "S" & StringFormat( "%30.2f", $Var2) )

    ; ende test

    und muss feststellen, dass ein Auffüllen mit Space (bei prop. Schrift) logischerweise nichts rechtsbündiges erzeugt.

    Edit:

    Ich benötige das nicht für eine msgbox!

    Diese sollte nur veranschaulichen, das, das so nicht funktioniert. Ich brauche den Inhalt der Variablen zur "Weiterverarbeitung" in einer Druckausgabe, wo leider, rechtsbündig Drucken, nicht unterstützt wird, So dass ich den Inhalt der Var. entsprechend anliefern muss.

    --------


    1) Wende ich die Funktion falsch an? Oder kann diese es tatsächlich nicht besser?

    2) Wenn gibt es eine andere Funktion, oder muss man das mühsam per "Hand" machen - wobei mir außer auffüllen mit Leerzeichen - mit oben beschriebenen Fehler auch nichts besseres einfällt.

    Danke vorab.

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

    Einmal editiert, zuletzt von Peter S. Taler (5. November 2017 um 20:51)

  • Hallo Peter S. Taler

    Ich denke du gehst das falsch an. Normalerweise würde ich einen Style für das jeweilige Control suchen, der mir so etwas ermöglicht.

    Bei einer Message Box:

    AutoIt
    #include <MsgBoxConstants.au3>
    
    MsgBox($MB_RIGHT, "Test", 5554564.488)

    Grüße autoiter

  • autoiter,

    sorry das ist mein Fehler, ich benötige das nicht für eine msgbox. Das sollte nur veranschaulichen, das, das so nicht funktioniert.

    ich brauche den Inhalt der Variablen zur "Weiterverarbeizung" in einet ruckausgabe, wo leider, rechtsbündig drucken nicht unterstützt wird.

    Gruß Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Ehrlich gesagt verstehe ich das immer noch nicht ganz. Auch wenn du Leerzeichen vor den String bringst, ist das doch nicht richtig rechtsbündig.

    Ich würde da vllt. eine kleine Funktion basteln, die mir je nach String-Länge Leerzeichen davor knallt, damit ich es fertig habe und hier wie du auf eine bessere Antwort warten ^^

    Grüße autoiter

  • Ich bin mir noch nicht ganz sicher was das eigentliche Ziel ist aber eins vorweg: Msgbox nutzt proportional Schriftarten anstatt Monotype. Heißt: Mit StringFormat wirst du dort deine Rechtsbündigkeit mit StringFormat nicht erreichen können.

    Überall dort wo monospaced Schriftarten verwendet werden (z.B. bei ConsoleWrite) klappt das jedoch.

    Dazu gibt es ja das blank (also Leerzeichen) als flag specification.

    Also um eine Zahl als String auszugeben der 10 Zeichen lang ist, 2 Nachkommastellen hat und rechtsbündig geschrieben wird sieht das so aus:

    AutoIt
    ConsoleWrite(StringFormat("% 10.2f\n% 10.2f\n% 10.2f\n", 9.0, 123.456, 12345678901234567890.00))
  • Hmm - ich bin wohl nicht in der Lage das zu beschreiben..

    Ich probier es nochmal..

    Wenn ich Zahlen oder Zahlenziffernkombinationen rechtsbündig schreiben will, nutzt auffüllen mit Space nichts. Denn beim Drucken = Space ungleich einem Zeichen (Proportionalschrift). Wie also etwas rechtsbündig ausrichten wenn man nicht mit spaces auffüllen kann --> da sinnlos?

    Zur Verdeutlichung habe ich das eben in der msgbox dargestellt.

    Mann müsste sozusagen einen rechtsbündigen Tabulator habe - den ich aber in der Druckausgabe auch nicht habe.

    Stell Dir vor Du sollst einen Text in Word rechts ausrichten ohne Tab Funktion bzw ohne Funktion etwas rechts auszurichten.. Geht auch nicht!

    Nun eben meine Frage:

    Gibt es entsprechende Funktion in Autoit bzw. Geht das mit stringformat?

    Gruß

    Peter

    ps.: Sorry wenn das ev. verworren klingt...... ich bemühe mich es darzustellen...

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Denn beim Drucken = Space ungleich einem Zeichen (Proportionalschrift).

    Dann mal die wichtige Frage: Wo druckst du?
    Wenn du von proportional Schriftarten ausgehst hast du ja schon selbst festgestellt dass ein Auffüllen mit Leerzeichen (also genau das was StringFormat macht) nicht zielführend ist.

    Daher musst du die Möglichkeiten nutzen die du bei der Ausgabe hast. Also bei Msgbox z.B. das $MB_RIGHT-Flag oder bei Word die Option rechtsbündig oder was auch immer.

    Aber wenn du nicht mit monospace-Fonts arbeitest ist zum wiederholten mal StringFormat nicht das Werkzeug um dein Ziel zu erreichen.

  • Daher musst du die Möglichkeiten nutzen die du bei der Ausgabe hast. Also bei Msgbox z.B. das $MB_RIGHT-Flag oder bei Word die Option rechtsbündig oder was auch immer.

    Aber wenn du nicht mit monospace-Fonts arbeitest ist zum wiederholten mal StringFormat nicht das Werkzeug um dein Ziel zu erreichen.

    Sehe ich genauso !

    Bei nicht-proportionalen Schriften (wie mit ConsoleWrite) geht es einwandfrei :

    AutoIt
    $Var1 = 12345678901234567890.00
    $Var2 = 9.00
    ConsoleWrite(StringFormat("%030.2f\n%030.2f\n% 30.2f\n% 30.2f\n", $Var1, $Var2, $Var1, $Var2))

    Ausgabe :

    Code
    000000012345678901234567000.00
    000000000000000000000000009.00
           12345678901234567000.00
                              9.00

    Hatte nicht BugFix oder Oscar (?) erst vor Kurzem einen Beitrag verfasst, in dem es um die Berechnung der Länge proportionaler Schriften ging (anhand von Schriftart und Schriftgröße) ?

    Edit : Kommando zurück :whistling:

    Was ich im Hinterkopf hatte war :

    GuiCtrlBusy - wie ToolTip, nur anders ;-) - Final [v1.0]

    Da ging es aber um _GDIPlus_FontGetHeight , _GDIPlus_GraphicsMeasureString usw.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (5. November 2017 um 22:38)

  • Ich bin dankbar für Eure Hilfe - aber bitte - vergesst das mit der msgbox- Ich mach hier keinen Beitrag auf weil das da nicht rechtsbündig steht!

    1) Weil ich das $MB_RIGHT-Flag kenne

    2) Weil es mir "egal" ist wie das in der msg box steht.

    Ich wollte mit der Box nur darstellen was bei einer prop Ausgabe entsteht.

    Danke, ich habe Verstanden das das mit stringformat nicht geht. War ja auch Teil meiner Frage

    @ Musashi Dein Beispiel von #8 sollte man mal in die Hilfe einbauen !

    Xenobiologist hat schon vor 10 Jahren gemeint das müsse verbessert werden :)

    https://www.autoitscript.com/forum/topic/59403-stringformat/

    Gruß Peter

    Ps: Und wie bekomme ich das nun rechtsbündig ohne fixen Zeichensatz - den habe ich nicht....

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Wenn dir das so wichtig ist, warum änderst du dann die Schriftart nicht in eine für deinen Zweck,

    brauchbare Schriftart für die Druckausgabe. Dann würde es ja mit StringFormat wieder funktionieren,

  • Darauf wird es wohl hinauslaufen. Das wirft nur einige Seiten durcheinander - ich drücke mich gerade darum . Hatte die Hoffnung - das es hier eine Lösung - am trivialen vorbei - gibt.

    Apropos wichtig: Zahlen die untereinander stehen sehen eben einfach sch.. aus, wenn sie nicht fluchten...

    Gruß Peter

    PS.: Ich lasse das noch ein wenig offen - falls noch jemand eine Idee hat..

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

    • Offizieller Beitrag

    Rechtsbündige Ausgabe wäre schon machbar:

    - Gesamtausgabebreite festlegen

    - Länge Zahlenstring messen

    - Leerzeichenstring der Differenzlänge erstellen (ganz normal wie Text messen - GDI+ Funktionen)

    - beides zusammenfügen und ausgeben

    ABER

    Das bringt dir letztlich überhaupt nichts! Denn bei proportionaler Schriftart sind natürlich auch die Bereiche nach dem Komma unterschiedlich lang und somit hast du niemals eine sauber aufgereihte Liste.