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