Zahlen ausschreiben
Verfasst: 10.07.2020 14:30
				
				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...
Es können sicher noch einige "und" zu bestimmten Bedingungen eingefügt werden...
			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