Geldbetrag stückeln

    • Offizieller Beitrag

    Hi,
    sicher wird niemand das Proggi brauchen können ;) aber ich zeigs euch trotzdem mal.
    Fragestellung war: Wie kann ich einen beliebigen Geldbetrag auf die minimale Anzahl Banknoten und Münzen verteilen.

    Ich denke das Ergebnis sieht ganz hübsch aus :)

    Zum Testen braucht ihr die angehängte Datei "Euro.zip", wegen der Bildchen ;)

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    Dim $backcolor = 0x4A579B, $fcolor = 0xFFD700
    Dim $picpath = "D:\Eigene Bilder\Euro\"
    Dim $arVal[15], $arLabel[15], $arCheckBtn[15][2], $arCheck[15]
    For $i = 0 To 14
    $arCheckBtn[$i][1] = 1
    Next
    $arVal[0] = 500
    $arVal[1] = 200
    $arVal[2] = 100
    $arVal[3] = 50
    $arVal[4] = 20
    $arVal[5] = 10
    $arVal[6] = 5
    $arVal[7] = 2
    $arVal[8] = 1
    $arVal[9] = 0.5
    $arVal[10] = 0.2
    $arVal[11] = 0.1
    $arVal[12] = 0.05
    $arVal[13] = 0.02
    $arVal[14] = 0.01

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

    $Form1 = GUICreate("Geldbetrag stückeln", 500, 504, -1, -1)
    GUISetBkColor($backcolor)
    GUICtrlCreatePic($picpath & "500eur.jpg", 25, 32, 100, 51, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "200eur.jpg", 140, 33, 100, 54, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "100eur.jpg", 253, 32, 100, 56, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "50eur.jpg", 370, 31, 100, 55, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "20eur.jpg", 25, 118, 100, 54, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "10eur.jpg", 189, 121, 100, 53, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "5eur.jpg", 371, 121, 100, 53, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "2eur.jpg", 25, 215, 75, 75, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "1eur.jpg", 150, 215, 75, 75, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "50ct.jpg", 275, 215, 75, 75, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "20ct.jpg", 400, 215, 75, 75, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "10ct.jpg", 25, 320, 75, 75, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "5ct.jpg", 150, 320, 75, 75, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "2ct.jpg", 275, 320, 75, 75, BitOR($SS_NOTIFY,$WS_GROUP))
    GUICtrlCreatePic($picpath & "1ct.jpg", 400, 320, 75, 75, BitOR($SS_NOTIFY,$WS_GROUP))
    $arLabel[0] = GUICtrlCreateLabel("", 52, 11, 45, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    $arCheckBtn[0][0] = GUICtrlCreateButton("" ,25, 11, 12, 12, $BS_ICON)
    $arCheckBtn[1][0] = GUICtrlCreateButton("" ,140, 11, 12, 12, $BS_ICON)
    $arCheckBtn[2][0] = GUICtrlCreateButton("" ,253, 11, 12, 12, $BS_ICON)
    $arCheckBtn[3][0] = GUICtrlCreateButton("" ,370, 11, 12, 12, $BS_ICON)
    $arCheckBtn[4][0] = GUICtrlCreateButton("" ,25, 96, 12, 12, $BS_ICON)
    $arCheckBtn[5][0] = GUICtrlCreateButton("" ,189, 96, 12, 12, $BS_ICON)
    $arCheckBtn[6][0] = GUICtrlCreateButton("" ,371, 96, 12, 12, $BS_ICON)
    $arCheckBtn[7][0] = GUICtrlCreateButton("" ,25, 190, 12, 12, $BS_ICON)
    $arCheckBtn[8][0] = GUICtrlCreateButton("" ,150, 190,12,12, $BS_ICON)
    $arCheckBtn[9][0] = GUICtrlCreateButton("" ,275, 190,12,12, $BS_ICON)
    $arCheckBtn[10][0] = GUICtrlCreateButton("" ,400, 190,12,12, $BS_ICON)
    $arCheckBtn[11][0] = GUICtrlCreateButton("" ,25, 297,12,12, $BS_ICON)
    $arCheckBtn[12][0] = GUICtrlCreateButton("" ,150, 297,12,12, $BS_ICON)
    $arCheckBtn[13][0] = GUICtrlCreateButton("" ,275, 297,12,12, $BS_ICON)
    $arCheckBtn[14][0] = GUICtrlCreateButton("" ,400, 297,12,12, $BS_ICON)
    For $i = 0 To 14
    GUICtrlSetImage($arCheckBtn[$i][0], $picpath & "check12x12.ico")
    Next
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[1] = GUICtrlCreateLabel("", 165, 11, 45, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[2] = GUICtrlCreateLabel("", 279, 11, 45, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[3] = GUICtrlCreateLabel("", 400, 11, 45, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[4] = GUICtrlCreateLabel("", 52, 96, 45, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[5] = GUICtrlCreateLabel("", 214, 96, 45, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[6] = GUICtrlCreateLabel("", 400, 96, 45, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[7] = GUICtrlCreateLabel("", 41, 190, 43, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[8] = GUICtrlCreateLabel("", 166, 190, 43, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[9] = GUICtrlCreateLabel("", 288, 190, 49, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[10] = GUICtrlCreateLabel("", 412, 190, 49, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[11] = GUICtrlCreateLabel("", 41, 297, 49, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[12] = GUICtrlCreateLabel("", 166, 297, 49, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[13] = GUICtrlCreateLabel("", 288, 297, 49, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $arLabel[14] = GUICtrlCreateLabel("", 412, 297, 49, 17, $SS_CENTER)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $Group1 = GUICtrlCreateGroup("Betrag", 24, 420, 453, 59)
    GUICtrlSetFont(-1, 10, 500)
    GUICtrlSetColor(-1, $fcolor)
    $Input1 = GUICtrlCreateInput("", 64, 442, 141, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL))
    GUICtrlSetColor(-1, $backcolor)
    GUICtrlSetBkColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetTip(-1, "Währung ganzzahlig oder mit maximal" & @LF & "2 Nachkommastellen eingeben." & @LF & "(Komma, nicht Dezimalpunkt verwenden.)")
    $ret = _GUICtrlCreateColorButton("Stückelung", 316, 442, 125, 21, $backcolor, $fcolor)
    $Button1 = $ret[0]
    $Label16 = GUICtrlCreateLabel("EUR", 210, 445, 40, 17)
    GUICtrlSetColor(-1, $fcolor)
    GUICtrlSetFont(-1, 10, 500)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    GUICtrlSetState($Input1, $GUI_FOCUS)
    ToolTip("Nicht verfügbare Werte können über die" & @LF & "jeweiligen Button abgewählt werden.", @DesktopWidth/2 -250, @DesktopHeight/2 -252)
    Sleep(3500)
    ToolTip("")

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

    Do
    $msg = GUIGetMsg()
    For $i = 0 To 14
    If $msg = $arCheckBtn[$i][0] Then
    If $arCheckBtn[$i][1] = 0 Then
    GUICtrlSetImage($arCheckBtn[$i][0], $picpath & "check12x12.ico")
    $arCheckBtn[$i][1] = 1
    ElseIf $arCheckBtn[$i][1] = 1 Then
    GUICtrlSetImage($arCheckBtn[$i][0], $picpath & "uncheck12x12.ico")
    $arCheckBtn[$i][1] = 0
    EndIf
    GUICtrlSetState($Input1, $GUI_FOCUS)
    EndIf
    Next
    If $msg = $Button1 Then
    GUICtrlSetStyle($Button1, $SS_ETCHEDFRAME)
    Sleep(150)
    GUICtrlSetStyle($Button1, $SS_NOTIFY + $SS_GRAYRECT)
    _Berechnung()
    EndIf
    Until $msg = $GUI_EVENT_CLOSE

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

    Func _Berechnung()
    For $i = 0 To 14
    GUICtrlSetData($arLabel[$i], "")
    Next
    $div = StringReplace(GUICtrlRead($Input1), ",", ".")
    If _StringIsMoney($div) = 1 Then
    If $div > 0 Then
    For $i = 0 To 14
    If ($div >= $arVal[$i] And $arCheckBtn[$i][1] = 1) Then
    $G = Int($div / $arVal[$i])
    If $G > 0 Then GUICtrlSetData($arLabel[$i], $G)
    $R = Round($div - ($arVal[$i] * $G), 2)
    If $R = 0 Then ExitLoop
    $div = $R
    EndIf
    Next
    If $R > 0 Then GUICtrlSetData($Input1, "Rest " & $div)
    EndIf
    Else
    MsgBox(16, 'Achtung!', "Eingaben bitte ganzzahlig oder max. 2 Nachkommastellen!")
    EndIf
    GUICtrlSetState($Input1, $GUI_FOCUS)
    EndFunc

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

    Func _StringIsMoney($checkString)
    Dim $len = StringLen($checkString)
    If StringInStr($checkString, ".") Then
    $val = StringSplit($checkString, ".")
    If $val[0] > 2 Then Return 0
    If ($len - StringInStr($checkString, ".")) > 2 Then Return 0
    EndIf
    For $i = 1 To $len
    $tmp = StringMid($checkString, $i, 1)
    If Not (StringIsInt($tmp) Or $tmp = ".") Then
    Return 0
    EndIf
    Next
    Return 1
    EndFunc

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

    ;=============================================================================
    ;
    ; Function Name: _GUICtrlCreateColorButton()
    ;
    ; Description: Creates a colored Button
    ;
    ; Syntax: _GUICtrlCreateColorButton($text, $left, $top, $width, $height,$bkcolor[,$fontcolor])
    ;
    ; Parameter(s); $text = The text of the control
    ; $left = The left side of the control
    ; $top = The top of the control
    ; $width = The width of the control
    ; $height = The height of the control
    ; $bkcolor = Backgroundcolor of the control
    ; $fontcolor = [optional] Fontcolor of the control
    ;
    ; Return Value(s): array[1] = used to change colors
    ; array[0] = notifies GUIGetMsg if user clicks
    ;
    ; Author: rakudave <[email='rakudave@gmx.net'][/email]>
    ;=============================================================================
    Func _GUICtrlCreateColorButton($text, $left, $top, $width, $height, $bkcolor, $fontcolor = -1)
    Local $colbut[2]
    If $fontcolor == -1 Then $fontcolor = 0x000000
    $colbut[0] = GUICtrlCreateLabel("", $left, $top, $width, $height, $SS_BLACKRECT)
    GUICtrlCreateLabel("", $left, $top, $width - 1, $height - 1, $SS_WHITERECT)
    GUICtrlCreateLabel("", $left + 1, $top + 1, $width - 2, $height - 2, $SS_GRAYRECT)
    $colbut[1] = GUICtrlCreateLabel($text, $left + 1, $top + 1, $width - 3, $height - 3, $SS_NOTIFY & $SS_CENTER)
    GUICtrlSetBkColor(-1, $bkcolor)
    GUICtrlSetColor(-1, $fontcolor)
    GUICtrlSetFont(-1, 10, 500)
    Return $colbut
    EndFunc ;==>_GUICtrlCreateColorButton

    [/autoit]

    EDIT:

    - ein Bugfix (Danke snoozer für den Hinweis), Fehler in der Restbetragsberechnung.
    Bsp.:
    Basisbetrag = 20,54 lieferte 1x 20 EUR; 1x 50 ct; 1x 2 ct; 1x 1ct !! (Inflation ;) )
    Bei Ausgabe der Zwischenergebnisse ( $R = Mod($div, $arVal[$i]) ) war $R = 0,5399999 !!
    Auch eine Umstellung auf: $R =$div - ($arVal[$i] * $G) führte zum identischen Fehler.
    Naja, mit Round() gehts jetzt :)

    - Neu dazugekommen: die einzelnen Geldwerte können bei Bedarf abgewählt werden, um nur in bestimmte Geldwerte zu wechseln.
    Dazu bitte nochmal die "Euro.zip" laden, es sind Icons hinzugekommen.

  • Hallo BugFix,

    so in dieser Art wird eine Anwendung wohl eher selten erforderlich sein - nicht mal als Lernprogramm für Azubis zum Einzelhandelskauffrau/-mann *lacht*.

    Aber als Anregung für Hilfswerkzeuge im Bereich der Kasse kann es durchaus dienlich sein. Ich habe mal Versuche unternommen das Geld in der Kasse nicht zu zählen, sondern abzuwiegen um den Gesamtwert zu ermitteln.

    Doch dabei muss man dennoch das Geld ziemlich genau anschauen, da sich keine falsche Münze einschleichen darf........ lohnt also nicht richtig.

    Viele Grüße
    Carsten

    P.S: Hattest Du keine Probleme das Geld in den PC zu bekommen? Im Photoshop CS kommt doch tatsächlich eine Warnmeldung (Verboten!) wenn man Geldscheine bearbeiten möchte.

  • hey ho...cooles tool :)
    ich würde vll den pic path vll so gestalten: Dim $picpath = @ScriptDir&"\Euro\"...dann kann man das auch in anderen ordnern haben :)
    sonst super tool könnte man vll als kassierer verwenden wenn so ne komischen vögel kommen und 500€ in kleingeld wechseln wollen^^

    der snoozer

  • Nette Sache :)


    Wäre interessant, ob es dir auch gelänge rauszufinden welche Münzen oder Noten man überhaupt bräuchte um möglichst mit wenig Geldstücken einen Betrag darzustellen.

    Wäre es nicht vielleicht gut ein 25 cent stück zu haben? Und das 2 Cent Stückl abzuschaffen?
    Z.B. 1,32 € ist durch ein eurostück und ein 20 cent und 10 cent und eine 2 centmünzen bezahlbar (andere möglichkeiten brauchen noch mehr münzen z.B. 132 ein-cent münzen)

    Kein Plan, ich denke die Münzen- und Notenverteilung die wir haben wird schon das Optimum sein.

    • Offizieller Beitrag

    Hallo, hatte gar nicht soviel Resonanz erwartet :)
    Schön, wenn es euch auch gefällt.
    Der Picturepath war natürlich rein willkürlich auf mein System zugeschnitten - aber deshalb habe ich ihn ja als Variable erstellt, mit einem Handgriff von jedem zu ändern ;)
    Mir ist noch eine Idee zur Verbesserung eingefallen, werdet ihr dann als Edit im ersten Post finden.

    Edit:

    Zitat

    P.S: Hattest Du keine Probleme das Geld in den PC zu bekommen? Im Photoshop CS kommt doch tatsächlich eine Warnmeldung (Verboten!) wenn man Geldscheine bearbeiten möchte.


    Photoshop *grr* *schüttel* - Ich weiß schon, warum ich Gimp benutze. :rofl:

  • nabend bugfix hab jetzt nochmal dein buggefixtes programm ausprobiert^^
    joa naja bei photoshop cs2 kann man zwar die geldscheine einscannen aber nicht speichern...fand ich anfangs ganz cool...aber seit wir den neuen druecker haben..... :rofl:^^
    noch eine sache wenn ich 0,03 cent angezeigt haben will und ich aber keine 1 und 2 cent münzen hab kommt ne unschöne fehlermeldung....naja gut könnte man vll noch abfangen aber muss auch net sein....


    trotzdem cooles tool :)
    der snoozer