Bestimmtes Zahlenformat

  • Hallo liebe Community,

    AutoIt und dieses Forum hier ist wirklich klasse. Hab schon einige Scripte geschrieben die mir viel Arbeit ersparen.
    Nun brauche ich aber etwas Hilfe bei zwei kleinen Problemen, bin leider kein Profi.

    Ich möchte ein Script schreiben das mir z.B. etwas berechnet und die Lösung in einem bestimmten Zahlenformat ausgibt.

    Die Eingabe (InputBox) lautet z.B.: 14,42

    Dann wird berechnet z.B.: 14,42 / 2 = 7,21
    7,21 + 0,19 = 7,40

    Und das soll dann Ausgegeben werden (z.B. MsgBox): 007400

    Meine Probleme:

    1: Mit Komma rechnet der Script nicht richtig (14,42 / 2 = 7), mit einem Punkt jedoch schon (14.42 / 2 = 7.21).
    Mit Komma werden nur die stellen vor dem Komma berechnet. Was für eine Möglichkeit gibt es außer Punkt zu benutzen?

    2: Das Ergebnis muß ohne Komma oder Punkt ausgegeben werden und immer Sechsstellig.
    Wobei die ersten Drei Stellen vor dem eigentlichen Komma sind und die letzten Drei Stellen hinter dem Komma.
    Nochmal paar Beispiele:

    123,123 --> 123123
    1,23 --> 001230
    12.20 --> 012200

    Bitte seit so freundlich und Helft mit mein Ziel näher zu kommen.

    Vielen lieben Dank.

    Gruß Dodo

    3 Mal editiert, zuletzt von dodo-dk (29. Juli 2011 um 15:20)

  • So kannst du auf das Format kommen:

    Spoiler anzeigen
    [autoit]

    Local $Zahl = InputBox("Zahl eingeben", "Bitte geben Sie eine reale Zahl ein")
    $Zahl = StringReplace($Zahl, ",", ".")
    If Not (StringIsFloat($Zahl) Or StringIsInt($Zahl)) Then
    ConsoleWrite("Falsche Eingabe!" & @CRLF)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $iNachkomma = StringInStr($Zahl, ".")
    Local $iLen = StringLen($Zahl)
    Local $iErgebnis

    [/autoit] [autoit][/autoit] [autoit]

    If $iNachkomma <> 0 Then
    $iErgebnis = $Zahl * 10^($iLen - $iNachkomma)
    Else
    $iErgebnis = $Zahl
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    While StringLen($iErgebnis) < 6
    $iErgebnis = "0" & $iErgebnis
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite($iErgebnis & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Hallo funkey,

    vielen Dank für deine schnelle Hilfe und Zeir, sieht sehr gut aus. Funktioniert aber nicht ganz richtig.

    Wenn ich z.B. 15,3 eingebe kommt 000153 raus. Es müsste aber 015300 rauskommen.

    Die erste Ziffer von den 6 ist die 3 Stelle vor dem Komma (100er). Die zweite Ziffer ist die zweite Stelle vor dem Komma (10er). Die dritte Stelle ist erste Stelle vor dem Komma. Die vierte Ziffer ist die erste Stelle hinter dem Komma. Die fünfte Ziffer ist die zweite Stelle hinter dem Komma und die sechste Ziffer ist die dritte Stelle nach dem Komma.

    Somit wird aus :

    14,52 = 014520
    150,4 = 150400
    1,525 = 001525

    Hier noch ein Bild: http://imageshack.us/photo/my-images/807/unbenanntaw.jpg/

    Vielen vielen Dank.

  • Zu deinem Kommaproblem: Lass AutoIt aus deiner Eingabe (hier InputBox()) jedes Komma in einem Punkt wandeln (mit StringReplace) und das Ergebnis dann als Zahl interpretieren (mit Number()).
    Zu deiner Ausgabe: Wenn du dich mit der printf-Syntax von C auskennst kannst du mit StringFormat() die Zahl auf gewisse Anzahl an Vor-und-Nachkommastellen formatieren. Danach musst du nur noch den Punkt aus dem Ausgabestring entfernen (mit StringReplace()) und du hast dein gewünschtes Format:

    [autoit]

    Global $f_Zahl1 = Number(StringReplace(InputBox("Zahl eingeben", "Bitte Zahl eingeben"), ",", "."))
    Global $f_Zahl2 = Number(StringReplace(InputBox("Zahl eingeben", "Bitte 2. Zahl eingeben"), ",", "."))

    [/autoit][autoit][/autoit][autoit]

    Global $f_Division = $f_Zahl1 / $f_Zahl2

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0,"Ergebnis", StringReplace(StringFormat("%07.3f", $f_Division), ".", ""))

    [/autoit]
  • Klasse, genau so etwas habe ich mir vorgestellt.

    Vielen vielen Dank euch beiden.

    Wie kann ich mich dankbar zeigen?

  • Eine kleine Bitte noch an euch Experten - die letzte.

    Mein Script ist nun dank euerer Hilfe so gut wie fertig.
    Doch ein Problem hat sich noch ergeben.

    Ich muß eine Zeile in einer Datei schreiben, die schaut z.B. so aus:

    Code
    GEO D:\2K500\001         EXEC STP EXEC WIE EXEC T01 EXEC S01 FROM 001 TO 999
    
    
    oder
    
    
    GEO D:\3R32\001          EXEC STP EXEC WIE EXEC T01 EXEC S01 FROM 001 TO 999

    Die Zeile ist immer gleich bis auf das Verzeichnis (siehe oben 2K500\001 oder 3R32\001). Das Verzeichnis ist eine Variabel.
    Das Problem hierbei ist das dieses EXEC und alles weitere was danach kommt genau an der Stelle bleiben muß. Es muß ab der 25 Stelle beginnen. Also das erste E von EXEC ist die 26 Stelle von beginn der Zeile.

    Die Lücke zwischen dem Verzeichnis und EXEC muss dann mit Leerzeichen angepasst werden, abhängig wie lang das Verzeichnis ist.

    Das wäre echt klasse wenn Ihr mir die letzte Hürde nehmen könnt. Das ist leider zu komplex für mich da ich mit Programmieren eigentlich nichts am Hut habe.

    Vielen Dank nochmals.

    Einmal editiert, zuletzt von dodo-dk (29. Juli 2011 um 15:05)

  • Auch hier kann z.B. wieder StringFormat() verwendet werden:

    [autoit]

    Global Const $s_Verzeichnis = "D:\3R32\001"

    [/autoit][autoit][/autoit][autoit]

    Global $s_Zeile = StringFormat("GEO %-21sEXEC STP EXEC WIE EXEC T01 EXEC S01 FROM 001 TO 999", $s_Verzeichnis)
    ConsoleWrite($s_Zeile & @CRLF)

    [/autoit]
  • Klasse, aller erste Sahne!!!

    Kommt mit der Lösung wie aus der Pistole geschossen und ich quäle und bastle stundenlang rum.

    Vielen lieben Dank.

    Fühle mich grad als ob Weihnachten wäre :D

  • Hey, ihr liegt fast Richtig, keine CNC Fräse sondern eine Erodiermaschine. :D


    Einen kleinen schöhnheits Fehler habe ich noch gefunden und weiß nicht warum das so ist.

    Ich kann die InputBox mit Cancel nicht Abbrechen.

    [autoit]

    $kdurchm = Number(StringReplace(InputBox("Test", "Test"), ",", "."))
    If @error = 1 Then
    Exit
    EndIf

    [/autoit]

    Ohne dieses Number StringReplace ... funktioniert der Cancel button.

    Wenn ich statt die 1 eine 0 nehme geht es, aber dann wird es immer abgebrochen.
    Laut der Hilfe gibt doch der Cancel Button den Wert 1 zurück...!?

    Vielen Dank

  • @Error bezieht sich immer auf die zuletzt aufgerufene Funktion.
    Diese ist in deinem Fall Number().
    Du fragst also den @error von Number() ab statt von InputBox.
    Also musst du dafür sorgen das die @error-Abfrage direkt nach dem Aufruf der Funktion InputBox geschieht.
    Z.B. so:

    [autoit]

    Global $s_Input = InputBox("Test", "Test")
    If @error = 1 Then Exit

    [/autoit][autoit][/autoit][autoit]

    $kdurchm = Number(StringReplace($s_Input, ",", "."))

    [/autoit]