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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
wie_jetzt?
Beiträge: 21
Registriert: 28.08.2017 17:23

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

Beitrag 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.
Was das Programmieren angeht, bin ich ein Anfänger mit fast 40 Jahren Erfahrung, mit gelegentlichen, mitunter jahrzehntelangen Unterbrechungen. Kann mich noch dunkel an den TI58 bei der Bundeswehr Anfang der 1980er erinnern. Habe da mit "Mondlandung" viele Stunden der Heimatverteidung verbracht - Insider werden's kennen.
... wir hatten doch sonst nix!
H.Brill
Beiträge: 356
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

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

Beitrag 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.
PB 5.60
Benutzeravatar
Sylvia
verheiratet<br>1. PureGolf-Gewinner
Beiträge: 487
Registriert: 29.08.2004 09:42
Wohnort: Old Europe

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

Beitrag 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)
Basic Pur = PureBasic
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

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

Beitrag 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?
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

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

Beitrag 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
Zuletzt geändert von Thorsten1867 am 16.01.2019 13:54, insgesamt 3-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

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

Beitrag 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?
Antworten