Zahlen ausschreiben

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

Zahlen ausschreiben

Beitrag von Jac de Lad »

Da das jeder schon einmal gebraucht hat: Zahlen in Worte fassen. Darf hemmungslos weiterverwendet, verändert und gelöscht werden. Bitte bedenkt, dass ich noch Anfänger in Sachen PureBasic bin und ja, ich liebe temp, i, j...

Code: Alles auswählen

#Number2Word_UpperCase = 1
#Number2Word_MoreAnds = 2

Procedure.s smallNumber(number.s,stelle.s,count)
  Define temp.s,length,temp2.s,temp3.s
  length=Len(number)
  If Length=3
    If Left(number,1)<>"0"
      temp=StringField("ein|zwei|drei|vier|fünf|sechs|sieben|acht|neun",Val(Left(number,1)),"|")+"hundert"
    EndIf
  EndIf
  temp3=StringField("|ein|zwei|drei|vier|fünf|sechs|sieben|acht|neun",Val(Right(number,1))+1,"|")
  If length=1
    If (count>1) And (Right(number,1)="1")
      ProcedureReturn temp3+"e"
    Else
      ProcedureReturn temp3
    EndIf
  EndIf
  If Mid(number,Len(number)-1,1)="1"
    ProcedureReturn temp+stelle+StringField("zehn|elf|zwölf|dreizehn|vierzehn|fünfzehn|sechzehn|siebzehn|achtzehn|neunzehn",Val(Right(number,1))+1,"|")
  EndIf
  If length>1
    temp2=StringField("||zwanzig|dreißig|vierzig|fünfzig|sechzig|siebzig|achtzig|neunzig",Val(Mid(number,Len(number)-1,1))+1,"|")
    If Right(number,1)="0":ProcedureReturn temp+stelle+temp2:EndIf
  EndIf
  If temp2=""
    ProcedureReturn temp+stelle+temp3
  Else
    ProcedureReturn temp+stelle+temp3+"und"+temp2
  EndIf
EndProcedure

Procedure.s Number2Word(number.q,modus)
  Define count=0,aktuell.s,word.s,word2.s,zahlstring.s,stelle.s,negativ
  If number<0
    negativ=1
    number=Abs(number)
  EndIf
  zahlstring=Str(number)
  If number=0
    word="null"
  Else
    Repeat
      If Len(zahlstring)>2
        aktuell=Right(zahlstring,3)
        zahlstring=Left(zahlstring,Len(zahlstring)-3)
      Else
        aktuell=zahlstring
        zahlstring=""
      EndIf
      If aktuell<>"000"
        If (count=0) And (modus & #Number2Word_MoreAnds)
          If Len(Str(number))>2        
            If Val(Right(Str(number),2))=0
              stelle=""
            Else
              stelle="und"
            EndIf
          Else
            stelle=""
          EndIf
        Else
          stelle=""
        EndIf
        word2=smallNumber(aktuell,stelle,count)+StringField("|tausend|million|milliarde|billion|billiarde|trillion|trilliarde|quadrillion|quadrilliarde|pentillion|pentilliarde|sextillion|sextilliarde|septillion|septilliarde|oktillion|oktilliarde|nonillion|nonilliarde|dezilion|dezilliarde",count+1,"|")
        If (count>1) And (Val(aktuell)>1):If Right(word2,1)<>"e":word2+"e":EndIf:word2+"n":EndIf
        word=word2+word
      EndIf
      count+1
    Until zahlstring=""
  EndIf
  If (number=1) Or Right(Str(number),2)="01":word+"s":EndIf
  If negativ:word="minus"+word:EndIf
  If (modus & #Number2Word_UpperCase):word=UCase(Left(word,1))+Right(word,Len(word)-1):EndIf
  ProcedureReturn word
EndProcedure

CompilerIf #PB_Compiler_IsMainFile
  Debug Number2Word(1,#Number2Word_UpperCase | #Number2Word_MoreAnds)
  Debug Number2Word(-6001,0)
  Debug Number2Word(9000012,#Number2Word_MoreAnds)
  Debug Number2Word(70,#Number2Word_UpperCase)
  Debug Number2Word(286432975416,#Number2Word_MoreAnds)
  Debug Number2Word( 12, 0)
  Debug Number2Word( 27, 0)
  Debug Number2Word( 12027, 0)
  Debug Number2Word(286, #Number2Word_MoreAnds)
CompilerEndIf
Es können sicher noch einige "und" zu bestimmten Bedingungen eingefügt werden...
Zuletzt geändert von Jac de Lad am 13.07.2020 19:40, insgesamt 4-mal geändert.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Zahlen ausschreiben

Beitrag von NicTheQuick »

Ich habe das mal ins richtige Forum geschoben. In Offtopic gehörte es jedenfalls nicht. :wink:
Bild
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

Re: Zahlen ausschreiben

Beitrag von Jac de Lad »

Ich hab's nicht für so wichtig gehalten, dass ich es hier reinbringen wollte.
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Zahlen ausschreiben

Beitrag von mk-soft »

Extrem lange Zahlen zu lesen ist echt schwierig :mrgreen: :allright:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

Re: Zahlen ausschreiben

Beitrag von Jac de Lad »

Genau das war mein Ziel, muhahahahaha. :twisted:
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

Re: Zahlen ausschreiben

Beitrag von Jac de Lad »

Hier eine verbesserte Version:
- Die gute, alte Null wird erkannt
- Negative Zahlen werden unterstützt
- 20% mehr "und"
- 2 Konstanten (verwendbar als Parameter, kleine Entschulding an die hunterten Projekte, die jetzt geändert werden müssen): #PB_Number2Word_UpperCase (erstes Zeichen groß) und #PB_Number2Word_MoreAnds (mehr "und" (betrifft nur die zwei kleinsten Stellen))
- alle Variablen aus Freilandhaltung
- Erweiterung des Bereichs bis in den Dezilliardenbereich

Code im ersten Beitrag.
Zuletzt geändert von Jac de Lad am 12.07.2020 20:13, insgesamt 1-mal geändert.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Zahlen ausschreiben

Beitrag von Nino »

jacdelad hat geschrieben:Hier eine verbesserte Version:
Na ja. Hab nur mal eben 3 Tests gemacht ...

Code: Alles auswählen

Debug Number2Word( 12, 0)  ; -> zwei
Debug Number2Word( 27, 0)  ; -> siebenzwanzig
Debug Number2Word(286, 0)  ; -> zweihundertsechsachtzig
Immerhin ist die Ausgabe für 286 richtig, wenn ich dem Programm mitteile dass da ein "und" reingehört (das sollte es allerdings von selbst erkennen):

Code: Alles auswählen

Debug Number2Word(286, #PB_Number2Word_MoreAnds)  ; -> zweihundertsechsundachtzig
Bei siebenzwanzig hilft das jedoch nicht:

Code: Alles auswählen

Debug Number2Word( 27, #PB_Number2Word_MoreAnds)  ; -> siebenzwanzig
Außerdem:
Zur Unterscheidung von benutzerdefinierten Konstanten beginnen Konstanten, die von PureBasic selbst zur Verfügung gestellt werden, immer mit #PB_. Daher ist es eine sehr schlechte Idee, eigene Konstanten auch so zu benennen, dass sie mit #PB_ beginnen.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Zahlen ausschreiben

Beitrag von Kiffi »

Bild
Hygge
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Zahlen ausschreiben

Beitrag von Nino »

In Schläfrig-Holstein sagen wir zu 97: "bannig veel" (plattdeutsch für "ganz schön viele"). :D
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

Re: Zahlen ausschreiben

Beitrag von Jac de Lad »

Noch ein Update, die "und" wurden bei glatten Hundertern nicht richtig behandelt. Ich glaube jetzt sollte ich aber damit abschließen. :mrgreen:
@Nino: Du kannst es gern um einen "Holstein-Modus" erweitern. 8)

Ich sehe gerade, ich kann auch den ersten Beitrag ändern. Ich ändere den Code im ersten Beitrag.
Antworten