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