spokennumbers() - Zahlwörter in deutscher Schreibweise

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

spokennumbers() - Zahlwörter in deutscher Schreibweise

Post by Frosti » 27 Mar 2022, 07:08

spokennumbers() V1.0* - Zahlwörter in deutscher Schreibweise (*getestet mit AHK V1 Unicode)

Bevor ich meinen Beitrag starte, wünsche ich allen erstmal ein gesundes und friedliches Jahr 2022.

Mit der folgenden Funktion könnt Ihr Zahlen, wie die des Jahres (2022), als Zahlenwort (Zweitausendzweiundzwanzig), aber auch eine beliebige andere Zahl bis zu einer Größe von 999 Quadrilliarden ausgeben lassen. So lange Zahlenwörter braucht aber wahrscheinlich kein Mensch.
Das aktuelle Limit der Ausgabe besteht allerdings nur aufgrund der begrenzt verwendeten lateinischen Präfixe (Mi-, Bi-, Tri-, Quadri- entsprechend Millionen, Milliarden, Billionen ...). Also fühlt Euch frei, weitere Präfixe im Objekt numbers.groups einzufügen.
Falls jemand etwas bei der Rechtschreibung der Ausgabe zu bemängeln hat, bitte hier in den Thread schreiben.

Beispiel:

Code: Select all

#NoEnv
SetBatchLines, -1

t         	:= "`r`n"
M          	:= 0
FontSize	:= 10
numbers 	:= [6,12,73,105,1153,13678,416738,2416738,612416738,3612416768,23003612416768]
fnumbers	:= numbers.Count()
Loop 28
	numbers.Push(2**A_Index)
maxLen		:= StrLen(Max(numbers*))

For index, number in numbers {
	L 	:= Format("{:" maxLen "}", number) . " : " . spokennumber(number)
	M	:= M < StrLen(L) ? StrLen(L) : M
	t 	.= l "`r`n"
	t 	.= (index = fnumbers) ? " ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ··  `r`n" : ""
}

Gui, Font, % "s" FontSize, Consolas
Gui, Add, Edit, % "xm ym w" (M*(FontSize*0.75)) " r" (index+3) " Readonly hwndhEdit", % t
Controlsend,, {Down}{LControl Down}{End}{LControl Up}, % "ahk_id " hEdit
WinSet, Style 	, 0x50000004, % "ahk_id " hEdit
WinSet, ExStyle	, 0x00000000, % "ahk_id " hEdit
Gui, Show

return

GuiClose:
GuiEscape:
ExitApp

Funktion:

Code: Select all


spokennumber(number, uppercase:=true, separator:=".") { ;-- Darstellung ganzer Zahlen als Zahlwörter (deutsche Sprache)

  ; z.B. zur Verwendung in RegEx-Strings

  ; Zahlen werden in Gruppen zu je 3 Zahlen gesprochen (Tausendertrennung)
  ; 105                           	- Einhundertfünf
  ; 1.153                        	- Eintausend.einhundertdreiundfünfzig
  ; 13.678                      	- Dreizehntausend.sechshundertachtundsiebzig
  ; 416.738                       	- Vierhundertsechzehntausend.siebenhundertachtunddreißig
  ; 2.416.738                    	- Zweimillionen.vierhundertsechzehntausend.siebenhundertachtunddreißig
  ; 12.416.738                  	- Zwölfmillionen.vierhundertsechzehntausend.siebenhundertachtunddreißig
  ; 612.416.738                 	- Sechshundertzwölfmillionen.vierhundertsechzehntausend.siebenhundertachtunddreißig
  ; 3.612.416.768               	- Dreimilliarden.sechshundertzwölfmillionen.vierhundertsechzehntausend.siebenhundertachtundsechzig
  ; 23.003.612.416.768          	- Dreiundzwanzigbillionen.dreimilliarden.sechshundertzwölfmillionen.vierhundertsechzehntausend.siebenhundertachtundsechzig

  ; zu Fragen bzgl. der Rechtschreibung siehe z.B. hier:
  ; https://www.sekretaria.de/bueroorganisation/rechtschreibung/zahlwoerter/

	static numbers 	:= {twelves 	: ["ein", "zwei", "drei", "vier", "fünf", "sech", "sieb", "acht", "neun", "zehn", "elf", "zwölf"]
	      			, 	tens    	: ["zehn", "zwanzig", "dreißig", "vierzig", "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig"]
	     			,	groups    	: ["tausend", "million", "milliarde", "billion", "billiarde", "trillion", "trilliarde", "quadrillion", "quadrilliarde"]}

  ; die Null
	If (number=0)
		return "Null"

  ; Vorarbeit - Tausendergruppen separieren
	GroupsOfThousands := Array()
	zerofillednumber      	:= Format("{:024}", number)
	zfnLen                 	:= StrLen(zerofillednumber)
	IgnoreZeros            	:= true
	Loop % (zfnLen/3) {
		ngroup := SubStr(zerofillednumber, (A_Index-1)*3+1, 3)
		If (IgnoreZeros && ngroup>0) || !IgnoreZeros {
			IgnoreZeros := false
			GroupsOfThousands.InsertAt(1, ngroup)
		}
	}

  ; gruppenweise in Zahlworte umwandeln
	For index, thousands in GroupsOfThousands {

		ngroup := SubStr("000" thousands, -2)
		d1 := SubStr(ngroup, -0)
		d2 := SubStr(ngroup, -1)
		d3 := SubStr(ngroup, 1, 1)

	  ; die Bezeichnung der Zahlengruppe
		spokennumber	:=	(index=1                         	?	""
					:   	 numbers.groups[index-1]
					.	(index>2 && ngroup>1	? (Mod(index, 2)=0 ? "n" : "en") : "")
					.    	(index>1 ? separator : ""))
					.     	 spokennumber

	  ; Zahlen von 1 bis 99
		spokennumber 	:=	(d2=0                           	?	""
					:     	 d2=1                           	?	numbers.twelves[d2] (index=1 ? "s" : index>2 ? "e" : "")
					:     	 d2=2                           	?	numbers.twelves[d2]
					:     	 d2=6                           	?	numbers.twelves[d2] "s"
					:     	 d2=7                           	?	numbers.twelves[d2] "en"
					:     	 d2>=3   && d2<=9 	     			?	numbers.twelves[d2]
					:     	 d2>=10 && d2<=12				  	?	numbers.twelves[d2]
					:    	 d2>=13 && d2<=19				 	?	numbers.twelves[d1] numbers.tens[1]
					:    	 d1=0                         	 	?	numbers.tens[SubStr(d2, 1,1)]
					:     	 numbers.twelves[d1] . (d1=6 ? "s" : d1=7 ? "en" :"")
					.        "und" . numbers.tens[SubStr(d2, 1,1)])
					. 		 spokennumber

	  ; die Hunderterstelle
		spokennumber:=  	(d3=0                             	?	""
					:     	 d3=6                             	?	numbers.twelves[d3] "s"
					:     	 d3=7                             	?	numbers.twelves[d3] "en"
					:    	 numbers.twelves[d3]) . (d3>0 ? "hundert" : "")
					. 		 spokennumber

	}

  ; erstes Zeichen in Großschreibung
	If uppercase
		spokennumber := Format("{:U}", SubStr(spokennumber, 1, 1)) . SubStr(spokennumber, -1*(StrLen(spokennumber)-2))

return spokennumber
}


BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: spokennumbers() - Zahlwörter in deutscher Schreibweise

Post by BoBo » 27 Mar 2022, 07:38

:thumbup:
Bevor ich meinen Beitrag starte, wünsche ich allen erstmal ein gesundes und friedliches Jahr 2022.
Neujahrswunsch :o Aber gerade noch so. Immerhin ist ja noch nicht der 31.12. :lol: :mrgreen:

Interessant finde ich, dass du das script intern auf Englisch verbuxelst, bei lupenreiner deutschsprachiger Ausgabe.
Frage: basiert die "Punkt-separierte" Ausgabe auf irgendeiner (DI)Norm, oder ging es hierbei vorrangig um die Lesbarkeit? :think:
Schließlich vermasselt einem das die Weltherrschaft bzgl der längstmöglichen Wörter :lol:

User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

Re: spokennumbers() - Zahlwörter in deutscher Schreibweise

Post by Frosti » 27 Mar 2022, 09:37

Ich programmiere intern immer mit nicht ganz lupenreiner englischer Sprache, muss ich zum "verbuxeln" sagen.
Die Punkte waren tatsächlich für die Leserbarkeit. Zuerst habe ich mir ein paar Beispiele für Zahlenwörter
unterschiedlicher Länge aufgeschrieben, um die Regeln beim Sprechen erkennen zu können.
Und so hat sich um diese Zahlenwörter dann der Code entwickelt. Das würde ich gern zur Norm machen!
Ne, mit den Leerzeichen in der Ausgabe sind die Wörter jetzt angenehmer zu lesen.

Post Reply

Return to “Skripte und Funktionen”