Seite 1 von 2

Zahlen ausschreiben

Verfasst: 10.07.2020 14:30
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...

Re: Zahlen ausschreiben

Verfasst: 10.07.2020 14:47
von NicTheQuick
Ich habe das mal ins richtige Forum geschoben. In Offtopic gehörte es jedenfalls nicht. :wink:

Re: Zahlen ausschreiben

Verfasst: 10.07.2020 15:01
von Jac de Lad
Ich hab's nicht für so wichtig gehalten, dass ich es hier reinbringen wollte.

Re: Zahlen ausschreiben

Verfasst: 10.07.2020 15:43
von mk-soft
Extrem lange Zahlen zu lesen ist echt schwierig :mrgreen: :allright:

Re: Zahlen ausschreiben

Verfasst: 10.07.2020 15:59
von Jac de Lad
Genau das war mein Ziel, muhahahahaha. :twisted:

Re: Zahlen ausschreiben

Verfasst: 11.07.2020 23:10
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.

Re: Zahlen ausschreiben

Verfasst: 12.07.2020 07:47
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.

Re: Zahlen ausschreiben

Verfasst: 12.07.2020 08:39
von Kiffi
Bild

Re: Zahlen ausschreiben

Verfasst: 12.07.2020 08:51
von Nino
In Schläfrig-Holstein sagen wir zu 97: "bannig veel" (plattdeutsch für "ganz schön viele"). :D

Re: Zahlen ausschreiben

Verfasst: 12.07.2020 20:11
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.