Seite 1 von 1

Stringgadget für Währung (und andere Einheiten)

Verfasst: 25.12.2017 16:10
von wie_jetzt?
Hallo Leute,

habe mir jetzt einige PB-Lösungen zum Thema "formatierte" Eingabe von Zahlwerten (z. B. für Währungen: max. 1 Komma, max. 2 Kommastellen, mit oder ohne 1000er Punkt) angeguckt und muss sagen, das Problem ist zwar oftmals pfiffig gelöst, jedoch meiner Meinung nach nicht wirklich gut. Oder ich habe - den Wald vor lauter Bäumen nicht sehend - die (für mich) richtige Lösung nicht gefunden.

Bitte mich nicht falsch verstehen - all die Programmierungen übersteigen meine Möglichkeiten um einiges und ich erkenne die Programmierleistungen gerne an. Allerdings fehlen mir einige Features - beispielsweise müsste die Null vor dem Komma bei Beträgen unter 1 Euro automatisch mit einem Wert überschrieben werden, bei Beträgen über 1 Euro dürfte die gar nicht als führende Null möglich sein. Bei den Cent-Beträgen müssten die Nullen überschrieben werden können, ohne vorher gelöscht werden zu müssen.

Kennt jemand den "ultimativen" Code für ein "Währungs-Stringgadget" oder eine fertige DLL (oder was anderes Externes, in PB nutzbares), die eine bessere Datenerfassung von Währungen, aber auch von anderen Datenformaten (z.B. m³ mit 3-stelligen Kommawerten) möglich macht? Der Knaller wäre natürlich, stünde die Einheit (Euro, Kubikmeter, was auch immer) im Eingabefeld , links oder rechts, mit drin - wie zum Beispiel in Tabellkalkulationen möglich.

Re: Stringgadget für Währung (und andere Einheiten)

Verfasst: 25.12.2017 20:03
von H.Brill
Hätte da noch eine DLL anzubieten :
http://xprofan.net/intl/de/forum/listvi ... nedit-dll/

Da brauchst du aber ein echtes Handle für die Editfelder, also
mit #Pb_Any erzeugen.

Re: Stringgadget für Währung (und andere Einheiten)

Verfasst: 26.12.2017 16:06
von Sylvia
Vielleicht sowas? Schon etwas älter, benutze es aber immer, immer wieder:

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=3279&highlight=
; Author: Sylvia
; Date: 29. December 2003
; OS: Windows
; Demo: Yes


;**********************************
;* 2003 Dec.29 "Sylvia" GermanForum
;**********************************

Procedure.s StringUsing(Format$,Wert)
  ; Liefert einen formatierten Zahlenstring zurück
  ;
  ; Format$ = Erste 2 Zeichen= ">$" = Wert wird Hexadezimal konvertiert
  ;           Erste 2 Zeichen= ">%" = Wert wird Binär       konvertiert
  ;
  ;           0  Ziffer/Vorzeichen oder zwingend 0
  ;           #  Ziffer/Vorzeichen oder Blank
  ;
  ;           andere Zeichen werden 1:1 ausgegeben
  ;
  ; Result$ = formatierter Zahlenstring

  Protected Result$,a,Wert$

  Result$=""

  If Len(Format$)=0: Goto StringUsingEnd: EndIf

  ; Wert in Hex/Binär/Dezimal-String umwandeln
  Select Left(Format$,2)
    Case ">$": Wert$=Hex(Wert): Format$=Right(Format$,Len(Format$)-2)
    Case ">%": Wert$=Bin(Wert): Format$=Right(Format$,Len(Format$)-2)

      Default:   Wert$=Str(Wert)
  EndSelect

  ; Result$ von hinten auffüllen
  For a=Len(Format$) To 1 Step -1
    Select Mid(Format$,a,1)
      Case "0"
        If Len(Wert$)
          Result$=Right(Wert$,1)+Result$
          Wert$=Left(Wert$,Len(Wert$)-1)
        Else
          Result$="0"+Result$
        EndIf

      Case "#"
        If Len(Wert$)
          Result$=Right(Wert$,1)+Result$
          Wert$=Left(Wert$,Len(Wert$)-1)
        Else
          Result$=" "+Result$
        EndIf

      Default
        Result$=Mid(Format$,a,1)+Result$

    EndSelect

  Next a

  StringUsingEnd:
  ProcedureReturn Result$

EndProcedure


; Beispiele
a$=">% %########  ########": Zahl= 123456789:      Debug StringUsing(a$,Zahl)
a$=">%%0000 0000 0000 0000": Zahl= 123456789:      Debug StringUsing(a$,Zahl)
Debug ""
a$=">$ 00 00 00 00":         Zahl= 123456789:      Debug StringUsing(a$,Zahl)
a$=">$ 0000 0000":           Zahl= 123456789:      Debug StringUsing(a$,Zahl)
Debug ""
a$="###0.000 kByte":         Zahl= 123456789/1024: Debug StringUsing(a$,Zahl)

Re: Stringgadget für Währung (und andere Einheiten)

Verfasst: 27.12.2017 01:01
von juergenkulow
Hallo,
hier eine kleine Währungs-Eingabe und Ausgabe Weltreise für weltweite Programme:
-123.456.789,00 € ; Deutschland
-123 456 789,00 € ; Frankreich
-€123,456,789.00 ; Irland
Fr.-123'456'789.00 ; Schweiz deutschsprachig
-123'456'789.00 fr. ; Schweiz französichsprachig
fr.-123'456'789.00 ; Schweiz ital.
-£123,456,789.00 ; UK
-$123,456,789.00 ; Australien
-R$ 123.456.789,00 ; Brasilien
-¥123,456,789 ; Japan keine Dezimalstellen
¥-123,456,789.00 ; China
₹ -1234,56,789.00 ; Indien englisch Zifferngruppierung
₹ -12,34,56,789.00 ; Indien Hindi Zifferngruppierung
($123,456,789.00) ; USA Klammern stehen für Minus

Wiki Währungsliste ISO 4717

Vielleicht hat ja jemand Lust auf eine Weltreise mit physikalischen Eingaben und Ausgaben?

Re: Stringgadget für Währung (und andere Einheiten)

Verfasst: 27.12.2017 19:11
von Thorsten1867

Code: Alles auswählen

Procedure.s FormatCash(Value.d, Country.s, Mask.s)
  Define Value$, Negativ = #False
  
  If Value < 0 : Negativ = #True : EndIf
  
  Select Left(Country, 2)
    Case "DE", "AT", "IT", "ES" ; Germany / Austria / Italy / Spain
      ProcedureReturn FormatNumber(Value, 2, ",", ".")+" €"
    Case "FR" ;  France
      ProcedureReturn FormatNumber(Value, 2, ",", " ")+" €"
    Case "IE" ;{ Ireland
      If Negativ
        ProcedureReturn ReplaceString(FormatNumber(Value, 2, ".", ","), "-", "-€")
      Else
        ProcedureReturn "€"+FormatNumber(Value, 2, ".", ",")
      EndIf ;}
    Case "CH" ;{ Switzerland
      Select Mid(Country, 3, 2)
        Case "FR"
          ProcedureReturn FormatNumber(Value, 2, ".", "'")+" fr."
        Case "IT"
          ProcedureReturn "fr."+FormatNumber(Value, 2, ".", "'")
        Default 
          ProcedureReturn "Fr."+FormatNumber(Value, 2, ".", "'")
      EndSelect ;}  
    Case "GB" ;{ Great Britain
      If Negativ
        ProcedureReturn ReplaceString(FormatNumber(Value, 2, ".", ","), "-", "-£")
      Else
        ProcedureReturn "£"+FormatNumber(Value, 2, ".", ",")
      EndIf ;}
    Case "AU" ;{ Australien
      If Negativ
        ProcedureReturn ReplaceString(FormatNumber(Value, 2, ".", ","), "-", "-$")
      Else
        ProcedureReturn "$"+FormatNumber(Value, 2, ".", ",")
      EndIf ;}
    Case "BR" ;{ Brazil
      If Negativ
        ProcedureReturn ReplaceString(FormatNumber(Value, 2, ".", ","), "-", "-R$ ")
      Else
        ProcedureReturn "R$ "+FormatNumber(Value, 2, ".", ",")
      EndIf ;}
    Case "JP" ;{ Japan
      If Negativ
        ProcedureReturn ReplaceString(FormatNumber(Value, 0, ".", ","), "-", "-¥")
      Else
        ProcedureReturn "¥"+FormatNumber(Value, 0, ".", ",")
      EndIf ;}
    Case "CN" ;  China
      ProcedureReturn "¥"+FormatNumber(Value, 2, ".", ",")
    Case "US" ;{ USA
      If Negativ
        ProcedureReturn ReplaceString(FormatNumber(Value, 2, ".", ","), "-", "($")+")"
      Else
        ProcedureReturn "$"+FormatNumber(Value, 2, ".", ",")
      EndIf ;}
    Default
      Debug "not supported"
  EndSelect
  
EndProcedure

CompilerIf #PB_Compiler_IsMainFile
  
  Debug FormatCash(12.95, "DE")

CompilerEndIf

Re: Stringgadget für Währung (und andere Einheiten)

Verfasst: 27.12.2017 21:12
von juergenkulow
Hallo Thorsten1867,

Code: Alles auswählen

CompilerIf #PB_Compiler_IsMainFile
  Read.s Land.s
  While Land<>"ZZZ" 
    Debug Land+":"+FormatCash(-9876543210.99,Land)+"  "+FormatCash(9876543210.99,Land)
    Read.s Land 
  Wend 
  
  DataSection
    Data.s "DE","FR","IE","CH","CHFR","CHIT","GB","AU","JP","CN","US"
    Data.s "BR","IN","INEN","BHD","BIF","CLF","CLP","CVE","DJF","GNF","IQD","ISK"
    Data.s "KMF","KRW","LYD","MGA","MRO","OMR","PYG","UGX","UYI","VND","XAF"
    Data.s "XOF","XPF","XBT","ZZZ" 
  
  CompilerEndIf

; DE:-9.876.543.210,99 €  9.876.543.210,99 €
; FR:-9 876 543 210,99 €  9 876 543 210,99 €
; IE:-€9,876,543,210.99  €9,876,543,210.99
; CH:Fr.-9'876'543'210.99  Fr.9'876'543'210.99
; CHFR:-9'876'543'210.99 fr.  9'876'543'210.99 fr.
; CHIT:fr.-9'876'543'210.99  fr.9'876'543'210.99
; GB:-£9,876,543,210.99  £9,876,543,210.99
; AU:-$9,876,543,210.99  $9,876,543,210.99
; JP:-¥9,876,543,211  ¥9,876,543,211
; CN:¥-9,876,543,210.99  ¥9,876,543,210.99
; US:(9,876,543,210.99)  $9,876,543,210.99
; BR:-R$9,876,543,210.99  R$9,876,543,210.99
; IN:₹-9,876,543,210.99  ₹9,876,543,210.99
; INEN:₹-9,876,543,210.99  ₹9,876,543,210.99
; BHD:-9,876,543,210.99  9,876,543,210.99
; BIF:-9,876,543,210.99  9,876,543,210.99
; CLF:-9,876,543,210.99  9,876,543,210.99
; CLP:-9,876,543,210.99  9,876,543,210.99
; CVE:-9,876,543,210.99  9,876,543,210.99
; DJF:-9,876,543,210.99  9,876,543,210.99
; GNF:-9,876,543,210.99  9,876,543,210.99
; IQD:-9,876,543,210.99  9,876,543,210.99
; ISK:-9,876,543,210.99  9,876,543,210.99
; KMF:-9,876,543,210.99  9,876,543,210.99
; KRW:-9,876,543,210.99  9,876,543,210.99
; LYD:-9,876,543,210.99  9,876,543,210.99
; MGA:-9,876,543,210.99  9,876,543,210.99
; MRO:-9,876,543,210.99  9,876,543,210.99
; OMR:-9,876,543,210.99  9,876,543,210.99
; PYG:-9,876,543,210.99  9,876,543,210.99
; UGX:-9,876,543,210.99  9,876,543,210.99
; UYI:-9,876,543,210.99  9,876,543,210.99
; VND:-9,876,543,210.99  9,876,543,210.99
; XAF:-9,876,543,210.99  9,876,543,210.99
; XOF:-9,876,543,210.99  9,876,543,210.99
; XPF:-9,876,543,210.99  9,876,543,210.99
; XBT:-9,876,543,210.99  9,876,543,210.99
Folgendes ist mir aufgefallen:
Beim negativem US-Dollar fehlt das $ Zeichen.
Beim Real fehlen Leerzeichen
Bei der indischen Rupie fehlen die Leerzeichen und die Zifferngruppierung in Hindi und Englisch sind falsch.
Ab BHD über den südkoreanischen Wong bis Bitcoin stimmt die Anzahl der Stellen nicht.
Es gibt keine Option für die Darstellung anderer Ziffernsysteme wie beim irakischen Dinar.
Was passiert wenn ich Euro im US-amerikanischen oder einem indischen Format darstellen will?