Seite 1 von 1
Zahlen in Worte (erledigt)
Verfasst: Mi, 22. Feb 2017 17:30
von peternmb
Hat vielleicht zufällig schon jemand eine fertige Funktion, die einen Zahlenwert in Worte umsetzt (für Quittungsdruck)?
Sicher kann ich das selber schreiben, aber warum das Rad noch einmal erfinden
Ich habe meine uralte Clipper-Funktion (von 1992!) gefunden, die auf Anhieb ohne Änderungen funktioniert
Re: Zahlen in Worte (erledigt)
Verfasst: Sa, 04. Mär 2017 6:31
von UliTs
Was spricht dagegen, sie her zu veröffentlichen?
Re: Zahlen in Worte (erledigt)
Verfasst: Sa, 04. Mär 2017 10:20
von peternmb
UliTs hat geschrieben:Was spricht dagegen, sie her zu veröffentlichen?
gerne, warum nicht - die Funktion ist, soweit ich mich erinnere irgendwie aus Basic abgeleitet, funktionierte aber sofort.
Irgendwo war noch ein Leerzeichen drin, habe ich aber nicht gesucht sondern bei der Rückgabe herausgenommen.
Code: Alles auswählen
function zahl2word
PARAMETERS Z
STORE INT(Z) TO TNZAHL
STORE 0 TO TNMILLE
STORE .T. TO TLZ0
STORE "ein zwei drei vier fünf sechs sieben acht neun " TO TCALPHA
STORE "zehn zwanzig dreißig vierzig fünfzig sechzig siebzig achzig neunzig " TO TCBETA
STORE "tausend millionen milliarde " TO TCMILLE
DO WHILE TNZAHL # 0
STORE " " TO TCZWI
STORE 0 TO TNVARI, TNEIN, TNZEHN, TNHUND
DO WHILE TNVARI < 3 .AND. TNZAHL # 0
STORE TNZAHL - ( ( INT(TNZAHL/10) )*10 ) TO TNZIFF
STORE (INT(TNZAHL/10)) TO TNZAHL
DO CASE
CASE TNVARI = 0
STORE TNZIFF TO TNEIN
CASE TNVARI = 1
STORE TNZIFF TO TNZEHN
CASE TNVARI = 2
STORE TNZIFF TO TNHUND
ENDCASE
STORE TNVARI + 1 TO TNVARI
ENDDO
IF TNHUND # 0
STORE TRIM ( SUBSTR(TCALPHA,((TNHUND-1)*8+1),8) )+"hundert" TO TCZWI
ENDIF
IF TNZEHN = 1 .AND. (TNEIN=1 .OR. TNEIN=2 .OR. TNEIN=7)
DO CASE
CASE TNEIN=1
STORE TCZWI+"elf" TO TCZWI
CASE TNEIN=2
STORE TCZWI+"zwölf" TO TCZWI
CASE TNEIN=7
STORE TCZWI+"siebzehn" TO TCZWI
ENDCASE
ELSE
IF TNEIN # 0
IF TNZEHN=0 .AND. TNMILLE < 1
IF TNHUND # 0 .OR. TNZAHL # 0
STORE TCZWI+"und" TO TCZWI
ENDIF
ENDIF
STORE TCZWI+TRIM (SUBSTR(TCALPHA,((TNEIN-1)*8+1),8) ) TO TCZWI
IF TNEIN = 1
IF TNZEHN=0
IF TNMILLE < 1
STORE TCZWI+"S" TO TCZWI
ENDIF
IF TNMILLE > 1
STORE TCZWI+"E" TO TCZWI
ENDIF
ENDIF
ENDIF
ENDIF
IF TNZEHN # 0
IF TNZEHN # 1 .AND. TNEIN # 0
STORE TCZWI+"und" TO TCZWI
ENDIF
STORE TCZWI + TRIM (SUBSTR(TCBETA,((TNZEHN-1)*8+1),8) ) TO TCZWI
ENDIF
ENDIF
IF TNMILLE >= 1 .AND. ( TNEIN # 0 .OR. TNZEHN # 0 .OR. TNHUND # 0 )
STORE TCZWI+TRIM (SUBSTR(TCMILLE,((TNMILLE-1)*10+1),10)) TO TCZWI
IF TNMILLE =3 .AND. TNEIN # 1
STORE TCZWI+"N" TO TCZWI
ENDIF
ENDIF
STORE LEN(TCZWI) TO TNLANG
IF TNLANG > 1
IF SUBSTR(TCZWI,1,1)=" "
STORE SUBSTR(TCZWI,2,(TNLANG-1)) TO TCZWI
ENDIF
IF TLZ0
STORE TCZWI TO GCZAHL
ELSE
STORE TCZWI+GCZAHL TO GCZAHL
ENDIF
STORE .F. TO TLZ0
ENDIF
STORE TNMILLE+1 TO TNMILLE
ENDDO
STORE LEN(GCZAHL) TO TNLANG
IF TNLANG > 1
store "*"+upper(substr(gczahl,1,1))+substr(gczahl,2,(tnlang-1))+"*" to gczahl
ENDIF
RETURN strtran(gczahl," ","")
Re: Zahlen in Worte (erledigt)
Verfasst: So, 05. Mär 2017 10:38
von Rudolf
Hallo, dann mal in sauberem Xbase++
Grüße
Rudolf
Code: Alles auswählen
function zahl2word(z)
******************************************************************
local nTNZAHL := INT(Z)
local nTNMILLE := 0
local lTLZ0 := .t.
local cTCALPHA := "ein zwei drei vier fünf sechs sieben acht neun "
local cTCBETA := "zehn zwanzig dreißig vierzig fünfzig sechzig siebzig achzig neunzig "
local cTCMILLE := "tausend millionen milliarde "
local cTCZWI := " ",nTNVARI := 0,nTNEIN := 0,nTNZEHN := 0, nTNHUND := 0
DO WHILE nTNZAHL # 0
cTCZWI := " ";nTNVARI := 0;nTNEIN := 0;nTNZEHN := 0; nTNHUND := 0
DO WHILE nTNVARI < 3 .AND. nTNZAHL # 0
TNZIFF := nTNZAHL - ( ( INT(nTNZAHL/10) )*10 )
nTNZAHL := (INT(nTNZAHL/10))
DO CASE
CASE nTNVARI = 0
nTNEIN := TNZIFF
CASE nTNVARI = 1
nTNZEHN := TNZIFF
CASE nTNVARI = 2
nTNHUND := TNZIFF
ENDCASE
nTNVARI := nTNVARI + 1
ENDDO
IF nTNHUND # 0
cTCZWI := TRIM(SUBSTR(cTCALPHA,((nTNHUND-1)*8+1),8) )+"hundert"
ENDIF
IF nTNZEHN = 1 .AND. (nTNEIN=1 .OR. nTNEIN=2 .OR. nTNEIN=7)
DO CASE
CASE nTNEIN=1
cTCZWI := cTCZWI+"elf"
CASE nTNEIN=2
cTCZWI := cTCZWI+"zwölf"
CASE nTNEIN=7
cTCZWI := cTCZWI+"siebzehn"
ENDCASE
ELSE
IF nTNEIN # 0
IF nTNZEHN = 0 .AND. nTNMILLE < 1
IF nTNHUND # 0 .OR. nTNZAHL # 0
cTCZWI := cTCZWI + "und"
ENDIF
ENDIF
cTCZWI := cTCZWI+TRIM (SUBSTR(cTCALPHA,((nTNEIN-1)*8+1),8) )
IF nTNEIN = 1
IF nTNZEHN=0
IF nTNMILLE < 1
cTCZWI := cTCZWI + "S"
ENDIF
IF nTNMILLE > 1
cTCZWI := cTCZWI + "E"
ENDIF
ENDIF
ENDIF
ENDIF
IF nTNZEHN # 0
IF nTNZEHN # 1 .AND. nTNEIN # 0
cTCZWI := cTCZWI + "und"
ENDIF
cTCZWI := cTCZWI + TRIM (SUBSTR(cTCBETA,((nTNZEHN-1)*8+1),8) )
ENDIF
ENDIF
IF nTNMILLE >= 1 .AND. ( nTNEIN # 0 .OR. nTNZEHN # 0 .OR. nTNHUND # 0 )
cTCZWI := cTCZWI+TRIM (SUBSTR(cTCMILLE,((nTNMILLE-1)*10+1),10))
IF nTNMILLE =3 .AND. nTNEIN # 1
cTCZWI := cTCZWI+"N" TO
ENDIF
ENDIF
TNLANG := LEN(cTCZWI)
IF TNLANG > 1
IF SUBSTR(cTCZWI,1,1)=" "
cTCZWI := SUBSTR(cTCZWI,2,(TNLANG-1))
ENDIF
IF lTLZ0
GCZAHL := cTCZWI
ELSE
GCZAHL := cTCZWI+GCZAHL
ENDIF
lTLZ0 := .F.
ENDIF
nTNMILLE := nTNMILLE+1
ENDDO
TNLANG := LEN(GCZAHL)
IF TNLANG > 1
gczahl := "*"+upper(substr(gczahl,1,1))+substr(gczahl,2,(tnlang-1))+"*"
ENDIF
RETURN strtran(gczahl," ","")
Re: Zahlen in Worte (erledigt)
Verfasst: So, 05. Mär 2017 12:29
von peternmb
Hallo Rudolf,
entferne in deinem Code noch das "TO"am Ende dieser Zeile, dann funktioniert auch das auf Anhieb
cTCZWI := cTCZWI+"N" TO
Re: Zahlen in Worte (erledigt)
Verfasst: So, 05. Mär 2017 12:54
von Tom
Und noch aus "achzig" "achtzig" machen, dann sind auch Sprachpuristen zufrieden.
Re: Zahlen in Worte (erledigt)
Verfasst: So, 05. Mär 2017 13:21
von Rudolf
Hallo, tja, testen war nicht mehr drin
Grüße
Rudolf