Seite 1 von 1

ZAHL IN TEXT

Verfasst: Do, 15.03.2007 14:00
von ronni
HALLO!
ICH SUCHE DIE MÖGLICHKEIT IN CALC, DIE IN EINER ZELLE STEHENDE ZAHL, IN EINER ANDEREN ZELLE ALS TEXT UMZUWANDELN. MIT DER FUNKTION BATHTEXT BEKOMME ICH IMMER NUR SELTSAME ZEICHEN ANGEZEIGT.

OPENOFFICE V.2.0.3 PORTABLE

Verfasst: Do, 15.03.2007 15:59
von Karolus
Hallo Ronni
Deine Feststelltaste (links neben dem A) hat sich anscheinend verklemmt, solltest du mal ölen, möchtest du Zahlen einfach nur als Text und nicht als Wert angezeigt bekommen ? -das erreichst du mit zb. dieser Formel: =TEXT(A1;"####,###").
Möchtest du aber bsplw. 123 als "hundertdreiundwanzig" ausgeben ? das geht am besten über Makrocode.

Gruß Karo

Verfasst: Do, 15.03.2007 17:04
von ronni
Danke für die Antwort!

Das mit dem =Text habe ich schon vorher versucht bekomme da aber immer nur Zahlen angezeigt.

Die 2. Möglichkeit der Anzeige (bsplw. 123 als "hundertdreiundwanzig) wäre super, aber mit der Erstelllung von Makros kenne ich mich nicht aus![/list]

Verfasst: Do, 15.03.2007 19:39
von Karolus
Hallo Ronni

Folgende Makrofunktion gibt Zahlen als ausgeschriebene Ziffernfolge getrennt durch einen Bindestrich zurück:

Code: Alles auswählen

function SchreibZifferfolge(n)as string
dim schrZiffer
dim s as string
schrZiffer() = Array ("null","eins","zwei","drei","vier","fünf","sechs","sieben","acht","neun")
for i = 1 to len(n)
s = s & schrZiffer(mid(n,i,1)) & "-"
next
schreibzifferfolge = left(s,len(s)-1)
End function
Aufruf aus einer Zelle mit:
=SCHREIBZIFFERFOLGE(A1)

Gruß Karo

Verfasst: Do, 15.03.2007 20:10
von ronni
Danke das sieht schon gut aus!

Wie würde das mit deinem Beispiel 123 als "hundertdreiundwanzig" aussehen?

Verfasst: Do, 15.03.2007 20:32
von Karolus
Hallo Ronni
Wie würde das mit deinem Beispiel 123 als "hundertdreiundwanzig" aussehen?
Gut, du hast es so gewollt, folgendes ist aus http://www.pitonyak.org/oo.php entnommen und halbwegs auf deutsche Schreibweise angepasst:

Code: Alles auswählen

Function NumberToText(ByVal n) As String
  REM by Andrew D. Pitonyak
  Dim sBigWordsUSA()
  Dim sBigWordsUK()
  Dim sBigWordsDE()

  REM 10^100 is a googol (10 duotrigintillion)
  REM This goes to 10^303, how big do you really want me to go?
  sBigWordsUSA = Array( "", _
     "thousand", "million", "billion", "trillion", "quadrillion", _
     "quintillion", "sexillion", "septillion", _
     "octillion", "nonillion", "decillion", "undecillion", "duodecillion", _
     "tredecillion","quattuordecillion", "quindecillion", "sexdecillion", _
     "septdecillion", "octodecillion", "novemdecillion", "vigintillion", _
     "unvigintillion", "duovigintillion", "trevigintillion", _
     "quattuorvigintillion", "quinvigintillion", "sexvigintillion", _
     "septvigintillion", "octovigintillion", "novemvigintillion", _
     "trigintillion", "untrigintillion", "duotrigintillion", _
     "tretrigintillion", "quattuortrigintillion", "quintrigintillion", _
     "sextrigintillion", "septtrigintillion", "octotrigintillion", _
     "novemtrigintillion", "quadragintillion", "unquadragintillion", _
     "duoquadragintillion", "trequadragintillion", "quattuorquadragintillion", _
     "quinquadragintillion", "sexquadragintillion", "septquadragintillion", _
     "octoquadragintillion", "novemquadragintillion", "quinquagintillion", _
     "unquinquagintillion", "duoquinquagintillion", "trequinquagintillion", _
     "quattuorquinquagintillion", "quinquinquagintillion", _
     "sexquinquagintillion", "septquinquagintillion", "octoquinquagintillion", _
     "novemquinquagintillion", "sexagintillion", "unsexagintillion", _
     "duosexagintillion", "tresexagintillion", "quattuorsexagintillion", _
     "quinsexagintillion", "sexsexagintillion", "septsexagintillion", _
     "octosexagintillion", "novemsexagintillion", "septuagintillion", _
     "unseptuagintillion", "duoseptuagintillion", "treseptuagintillion", _
     "quattuorseptuagintillion", "quinseptuagintillion", "sexseptuagintillion", _
     "septseptuagintillion", "octoseptuagintillion", "novemseptuagintillion", _
     "octogintillion", "unoctogintillion", "duooctogintillion", _
     "treoctogintillion", "quattuoroctogintillion", "quinoctogintillion", _
     "sexoctogintillion", "septoctogintillion", "octooctogintillion", _
     "novemoctogintillion", "nonagintillion", "unnonagintillion", _
     "duononagintillion", "trenonagintillion", "quattuornonagintillion", _
     "quinnonagintillion", "sexnonagintillion", "septnonagintillion", _
     "octononagintillion", "novemnonagintillion", "centillion" _
  )
  
  sBigWordsUK() = Array( "", "thousand", _
     "milliard", "billion", "billiard", "trillion", "trilliard", _
     "quadrillion", "quadrilliard", "quintillion", "quintilliard", _
     "sextillion", "sextilliard", "septillion", "septilliard", _
     "octillion", "octilliard", "nonillion", "nonilliard", "decillion", _
     "decilliard", "undecillion", "undecilliard", "dodecillion", _
     "dodecilliard", "tredecillion", "tredecilliard", "quattuordecillion", _
     "quattuordecilliard", "quindecillion", "quindecilliard", "sexdecillion", _
     "sexdecilliard", "septendecillion", "septendecilliard", "octodecillion", _
     "octodecilliard", "novemdecillion", "novemdecilliard", "vigintillion", _
     "vigintilliard", "unvigintillion", "unvigintilliard", "duovigintillion", _
     "duovigintilliard", "trevigintillion", "trevigintilliard", _
     "quattuorvigintillion", "quattuorvigintilliard", "quinvigintillion", _
     "quinvigintilliard", "sexvigintillion", "sexvigintilliard", _
     "septenvigintillion", "septenvigintilliard", "octovigintillion", _
     "octovigintilliard", "novemvigintillion", "novemvigintilliard", _
     "trigintillion", "trigintilliard", "untrigintillion", _
     "untrigintilliard", "duotrigintillion", "duotrigintilliard", _
     "tretrigintillion", "tretrigintilliard", "quattuortrigintillion", _
     "quattuortrigintilliard", "quintrigintillion", "quintrigintilliard", _
     "sextrigintillion", "sextrigintilliard", "septentrigintillion", _
     "septentrigintilliard", "octotrigintillion", "octotrigintilliard", _
     "novemtrigintillion", "novemtrigintilliard", "quadragintillion", _
     "quadragintilliard", "unquadragintillion", "unquadragintilliard", _
     "duoquadragintillion", "duoquadragintilliard", "trequadragintillion", _
     "trequadragintilliard", "quattuorquadragintillion", _
     "quattuorquadragintilliard", "quinquadragintillion", _
     "quinquadragintilliard", "sexquadragintillion", "sexquadragintilliard", _
     "septenquadragintillion", "septenquadragintilliard", _
     "octoquadragintillion", "octoquadragintilliard", _
     "novemquadragintillion", "novemquadragintilliard", "quinquagintillion", _
     "quinquagintilliard" _
  )

  sBigWordsDE() = Array( "", "Tausend","Million", _
     "Milliarde", "Billion", "Billiarde", "Trillion", "Trilliarde", _
     "Quadrillion", "Quadrilliarde", "Quintillion", "Quintilliarde", _
     "Sextillion", "Sextilliarde", "Septillion", "Septilliarde", _
     "Oktillion", "Oktilliarde", "Nonillion", "Nonilliarde", _
     "Dezillion", "Dezilliarde", "Undezillion", "Undezilliarde", _
     "Duodezillion", "Doudezilliarde", "Tredezillion", _
     "Tredizilliarde", "Quattuordezillion", "Quattuordezilliarde", _
     "Quindezillion", "Quindezilliarde", "Sexdezillion", _
     "Sexdezilliarde", "Septendezillion", "Septendezilliarde", _
     "Oktodezillion", "Oktodezilliarde", "Novemdezillion", _
     "Novemdezilliarde", "Vigintillion", "Vigintilliarde", _
     "Unvigintillion", "Unvigintilliarde", "Duovigintillion", _
     "Duovigintilliarde", "Trevigintillion", "Trevigintilliarde", _
     "Quattuorvigintillion", "Quattuorvigintilliarde", "Quinvigintillion", _
     "Quinvigintilliarde", "Sexvigintillion", "Sexvigintilliarde", _
     "Septenvigintillion", "Septenvigintilliarde", "Oktovigintillion", _
     "Oktovigintilliarde", "Novemvigintillion", "Novemvigintilliarde", _
     "Trigintillion", "Trigintilliarde", "Untrigintillion", _
     "Untrigintilliarde", "Duotrigintillion", "Duotrigintilliarde", _
     "Tretrigintillion", "Tretrigintilliarde", "Quattuortrigintillion", _
     "Quattuortrigintilliarde", "Quintrigintillion", "Quintrigintilliarde", _
     "Sextrigintillion", "Sextrigintilliarde", "Septentrigintillion", _
     "Septentrigintilliarde", "Oktotrigintillion", "Oktotrigintilliarde", _
     "Novemtrigintillion", "Novemtrigintilliarde", "Quadragintillion", _
     "Quadragintilliarde", "Unquadragintillion", "Unquadragintilliarde", _
     "Duoquadragintillion", "Duoquadragintilliarde", "Trequadragintillion", _
     "Trequadragintilliarde", "Quattuorquadragintillion", _
     "Quattuorquadragintilliarde", "Quinquadragintillion", _
     "Quinquadragintilliarde", "Sexquadragintillion", _
     "Sexquadragintilliarde", "Septenquadragintillion", _
     "Septenquadragintilliarde", "Oktoquadragintillion", _
     "Oktoquadragintilliarde", "Novemquadragintillion", _
     "Novemquadragintilliarde", "Quinquagintillion", "Quinquagintilliarde" _
  )

  Dim i As Integer
  Dim iInt As Integer
  Dim s As String
  Dim dInt As Double

     
  REM Chop off the decimal portion.
  dInt = Fix(n)
  If (dInt < 1000) Then
    NumberToText = SmallIntToText(CInt(dInt))
    Exit Function
  End If

  REM i is the index into the sBigWords array
  i = 0
  s = ""
  Do While dInt > 0
    iInt = CInt(dInt - Fix(dInt / 1000) * 1000)
    If iInt <> 0 Then
      If Len(s) > 0 Then s = " " & s
      s = SmallIntToText(iInt) & " " & sBigWordsDE(i) & s
    End If
    i = i + 1
    dInt = Fix(dInt / 1000)
    'Print "s = " & s & " dInt = " & dInt
  Loop
  NumberToText = s
End Function

Function SmallIntToText(ByVal n As Integer) As String
  REM by Andrew D. Pitonyak
  Dim sOneWords()
  Dim sTenWords()
  Dim s As String

  If n > 999 Then
    Print "Warning, n = " & n & " which is too large!"
    Exit Function
  End If

  sOneWords() = Array ("", _
     "eins",     "zwei",       "drei",    "vier",     "fünf", _
     "sechs",     "sieben",     "acht",    "neun",     "zehn", _
     "elf",  "zwölf",    "dreizehn", "vierzehn", "fünfzehn", _
     "sechszehn", "siebzehn", "achtzehn", "neunzehn", "zwanzig")
     
  sTenWords() = Array( "", "zehn", "zwanzig", "dreisig", "vierzig", _
                       "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig")
     
  s = ""
 If n > 99 Then
    hhh = sOneWords(Fix(n / 100)) & " hundert"
    	if Fix(n /100) = 1 then
    	hhh = "einhundert"
    	end if
    n = n MOD 100
    If n = 0 Then
      SmallIntToText = hhh
      Exit Function
    End If
    hhh = hhh & " "
  End If

  If (n <= 20) Then
  	SmallIntToText = hhh & sOneWords(n)
  	exit function
  else
    zz = sTenWords(Fix(n / 10))
    n = n MOD 10
    If n = 0 Then
      SmallIntToText = hhh & zz
      Exit Function
    End If
    zz = zz & " "
  End If
 
  SmallIntToText = hhh & sOneWords(n) & "und"& zz
End Function
Geändert 24.5.07 Karo

Aufruf mit: =NUMBERTOTEXT(A1)

Gruß Karo

Verfasst: Fr, 16.03.2007 10:49
von ronni
Danke für die schnelle Hilfe.

Jetzt noch die Frage:
Warum funktionieren die Formelfunktionen =Bathtext oder =Text nicht?

Verfasst: Fr, 16.03.2007 13:28
von Karolus
Hallo ronni
Jetzt noch die Frage:
Warum funktionieren die Formelfunktionen =Bathtext oder =Text nicht?
Sie funktionieren, sie tun nur nicht daß was du von ihnen erwartest,
=BATHTEXT() wandelt lateinische Buchstaben und arabische Zahlen in die Buchstaben und Zahlzeichen der Sprache "Bath" .
Die Funktion =TEXT(A1;"....") wandelt lediglich Zahlen-werte in die gleichen Ziffern aber ohne Wert(mit denen dann nicht mehr gerechnet werden kann).

Verfasst: Fr, 16.03.2007 14:47
von ronni
Hast mir sehr geholfen mit deiner Lösung.

Verfasst: Do, 24.05.2007 14:49
von mlebek
Also ihr könnt mich schlagen aber ich hab noch nie in StarBasic programmiert. Ich hab die Funktion derart abgewandelt dass aus

1 -> Eins
30->Dreißig
56 ->Sechundfünzig
1002 ->Eintausendzwei

wird.

Aufgerufen wird mit '=InWorten(A1)'

Vielleicht gehts sauberer aber scheint zu laufen.

Code: Alles auswählen

Function InWorten(ByVal n) As String
  REM by Andrew D. Pitonyak
  Dim sBigWordsDE()

  REM 10^100 is a googol (10 duotrigintillion)
  REM This goes to 10^303, how big do you really want me to go?

  sBigWordsDE() = Array( "", "tausend","million", _
     "milliarde", "billion", "billiarde", "trillion", "Trilliarde", _
     "Quadrillion", "Quadrilliarde", "Quintillion", "Quintilliarde", _
     "Sextillion", "Sextilliarde", "Septillion", "Septilliarde", _
     "Oktillion", "Oktilliarde", "Nonillion", "Nonilliarde", _
     "Dezillion", "Dezilliarde", "Undezillion", "Undezilliarde", _
     "Duodezillion", "Doudezilliarde", "Tredezillion", _
     "Tredizilliarde", "Quattuordezillion", "Quattuordezilliarde", _
     "Quindezillion", "Quindezilliarde", "Sexdezillion", _
     "Sexdezilliarde", "Septendezillion", "Septendezilliarde", _
     "Oktodezillion", "Oktodezilliarde", "Novemdezillion", _
     "Novemdezilliarde", "Vigintillion", "Vigintilliarde", _
     "Unvigintillion", "Unvigintilliarde", "Duovigintillion", _
     "Duovigintilliarde", "Trevigintillion", "Trevigintilliarde", _
     "Quattuorvigintillion", "Quattuorvigintilliarde", "Quinvigintillion", _
     "Quinvigintilliarde", "Sexvigintillion", "Sexvigintilliarde", _
     "Septenvigintillion", "Septenvigintilliarde", "Oktovigintillion", _
     "Oktovigintilliarde", "Novemvigintillion", "Novemvigintilliarde", _
     "Trigintillion", "Trigintilliarde", "Untrigintillion", _
     "Untrigintilliarde", "Duotrigintillion", "Duotrigintilliarde", _
     "Tretrigintillion", "Tretrigintilliarde", "Quattuortrigintillion", _
     "Quattuortrigintilliarde", "Quintrigintillion", "Quintrigintilliarde", _
     "Sextrigintillion", "Sextrigintilliarde", "Septentrigintillion", _
     "Septentrigintilliarde", "Oktotrigintillion", "Oktotrigintilliarde", _
     "Novemtrigintillion", "Novemtrigintilliarde", "Quadragintillion", _
     "Quadragintilliarde", "Unquadragintillion", "Unquadragintilliarde", _
     "Duoquadragintillion", "Duoquadragintilliarde", "Trequadragintillion", _
     "Trequadragintilliarde", "Quattuorquadragintillion", _
     "Quattuorquadragintilliarde", "Quinquadragintillion", _
     "Quinquadragintilliarde", "Sexquadragintillion", _
     "Sexquadragintilliarde", "Septenquadragintillion", _
     "Septenquadragintilliarde", "Oktoquadragintillion", _
     "Oktoquadragintilliarde", "Novemquadragintillion", _
     "Novemquadragintilliarde", "Quinquagintillion", "Quinquagintilliarde" _
  )

  Dim i As Integer
  Dim iInt As Integer
  Dim s As String
  Dim dInt As Double
  Dim textklein As String
  Dim ersterbuchstabe As String
     
  REM Chop off the decimal portion.
  dInt = Fix(n)
  If (dInt < 1000) Then
    textklein = SmallIntToText(CInt(dInt))
    ersterbuchstabe = Ucase(Left(textklein,1)
    InWorten = ersterbuchstabe & Right(textklein,Len(textklein)-1)
    Exit Function
  End If

  REM i is the index into the sBigWords array
  i = 0
  s = ""
  Do While dInt > 0
    iInt = CInt(dInt - Fix(dInt / 1000) * 1000)
    If iInt <> 0 Then
      REM If Len(s) > 0 Then s = " " & s
      s = SmallIntToText(iInt) & "" & sBigWordsDE(i) & s
    End If
    i = i + 1
    dInt = Fix(dInt / 1000)
    'Print "s = " & s & " dInt = " & dInt
  Loop
  REM If Right(Str(n),1) = "1" Then s = s & "s"
  textklein = s
  ersterbuchstabe = Ucase(Left(textklein,1)
  InWorten = ersterbuchstabe & Right(textklein,Len(textklein)-1)
End Function

Function SmallIntToText(ByVal n As Integer) As String
  REM by Andrew D. Pitonyak
  Dim sOneWords()
  Dim sTenWords()
  Dim s As String
  Dim eins As String

  If n > 999 Then
    Print "Achtung, n = " & n & " was zu gross ist!"
    Exit Function
  End If

  sOneWords() = Array ("", _
     "ein",     "zwei",       "drei",    "vier",     "fünf", _
     "sechs",     "sieben",     "acht",    "neun",     "zehn", _
     "elf",  "zwölf",    "dreizehn", "vierzehn", "fünfzehn", _
     "sechszehn", "siebzehn", "achtzehn", "neunzehn", "zwanzig")
     
  sTenWords() = Array( "", "zehn", "zwanzig", "dreißig", "vierzig", _
                       "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig")
     
  eins = "j"
  s = ""
  If n > 99 Then
    hhh = sOneWords(Fix(n / 100)) & "hundert"
    n = n MOD 100
    If n = 0 Then
      SmallIntToText = hhh
      Exit Function
    End If
  End If

  If (n > 20) Then
    eins = "n"
    zz = sTenWords(Fix(n / 10))
    If Right(Str(n),1) <> "0" Then zz = "und" & zz     
    n = n MOD 10
    If n = 0 Then
      If Right(Str(zz),2) = "01" Then zz = zz & "s"
      SmallIntToText = hhh & zz
      Exit Function
    End If
  End If
  If n = 1 Then
    If eins = "j" Then zz = zz & "s"
  End If
  SmallIntToText = hhh & sOneWords(n) & zz
End Function

Verfasst: Do, 24.05.2007 18:20
von mlebek
Hier nochmal mit Abfangen von leeren Einträgen:

Code: Alles auswählen

Function InWorten(ByVal n) As String
  REM by Andrew D. Pitonyak
  Dim sBigWordsDE()

  REM 10^100 is a googol (10 duotrigintillion)
  REM This goes to 10^303, how big do you really want me to go?

  sBigWordsDE() = Array( "", "tausend","million", _
     "milliarde", "billion", "billiarde", "trillion", "Trilliarde", _
     "Quadrillion", "Quadrilliarde", "Quintillion", "Quintilliarde", _
     "Sextillion", "Sextilliarde", "Septillion", "Septilliarde", _
     "Oktillion", "Oktilliarde", "Nonillion", "Nonilliarde", _
     "Dezillion", "Dezilliarde", "Undezillion", "Undezilliarde", _
     "Duodezillion", "Doudezilliarde", "Tredezillion", _
     "Tredizilliarde", "Quattuordezillion", "Quattuordezilliarde", _
     "Quindezillion", "Quindezilliarde", "Sexdezillion", _
     "Sexdezilliarde", "Septendezillion", "Septendezilliarde", _
     "Oktodezillion", "Oktodezilliarde", "Novemdezillion", _
     "Novemdezilliarde", "Vigintillion", "Vigintilliarde", _
     "Unvigintillion", "Unvigintilliarde", "Duovigintillion", _
     "Duovigintilliarde", "Trevigintillion", "Trevigintilliarde", _
     "Quattuorvigintillion", "Quattuorvigintilliarde", "Quinvigintillion", _
     "Quinvigintilliarde", "Sexvigintillion", "Sexvigintilliarde", _
     "Septenvigintillion", "Septenvigintilliarde", "Oktovigintillion", _
     "Oktovigintilliarde", "Novemvigintillion", "Novemvigintilliarde", _
     "Trigintillion", "Trigintilliarde", "Untrigintillion", _
     "Untrigintilliarde", "Duotrigintillion", "Duotrigintilliarde", _
     "Tretrigintillion", "Tretrigintilliarde", "Quattuortrigintillion", _
     "Quattuortrigintilliarde", "Quintrigintillion", "Quintrigintilliarde", _
     "Sextrigintillion", "Sextrigintilliarde", "Septentrigintillion", _
     "Septentrigintilliarde", "Oktotrigintillion", "Oktotrigintilliarde", _
     "Novemtrigintillion", "Novemtrigintilliarde", "Quadragintillion", _
     "Quadragintilliarde", "Unquadragintillion", "Unquadragintilliarde", _
     "Duoquadragintillion", "Duoquadragintilliarde", "Trequadragintillion", _
     "Trequadragintilliarde", "Quattuorquadragintillion", _
     "Quattuorquadragintilliarde", "Quinquadragintillion", _
     "Quinquadragintilliarde", "Sexquadragintillion", _
     "Sexquadragintilliarde", "Septenquadragintillion", _
     "Septenquadragintilliarde", "Oktoquadragintillion", _
     "Oktoquadragintilliarde", "Novemquadragintillion", _
     "Novemquadragintilliarde", "Quinquagintillion", "Quinquagintilliarde" _
  )

  Dim i As Integer
  Dim iInt As Integer
  Dim s As String
  Dim dInt As Double
  Dim textklein As String
  Dim ersterbuchstabe As String
     
  If n = 0 Then
    InWorten = "" 
    Exit Function
  End If 
  REM Chop off the decimal portion.
  dInt = Fix(n)
  If (dInt < 1000) Then
    textklein = SmallIntToText(CInt(dInt))
    ersterbuchstabe = Ucase(Left(textklein,1)
    InWorten = ersterbuchstabe & Right(textklein,Len(textklein)-1)
    Exit Function
  End If

  REM i is the index into the sBigWords array
  i = 0
  s = ""
  Do While dInt > 0
    iInt = CInt(dInt - Fix(dInt / 1000) * 1000)
    If iInt <> 0 Then
      REM If Len(s) > 0 Then s = " " & s
      s = SmallIntToText(iInt) & "" & sBigWordsDE(i) & s
    End If
    i = i + 1
    dInt = Fix(dInt / 1000)
    'Print "s = " & s & " dInt = " & dInt
  Loop
  REM If Right(Str(n),1) = "1" Then s = s & "s"
  textklein = s
  ersterbuchstabe = Ucase(Left(textklein,1)
  InWorten = ersterbuchstabe & Right(textklein,Len(textklein)-1)
End Function

Function SmallIntToText(ByVal n As Integer) As String
  REM by Andrew D. Pitonyak
  Dim sOneWords()
  Dim sTenWords()
  Dim s As String
  Dim eins As String

  If n > 999 Then
    Print "Achtung, n = " & n & " was zu gross ist!"
    Exit Function
  End If

  sOneWords() = Array ("", _
     "ein",     "zwei",       "drei",    "vier",     "fünf", _
     "sechs",     "sieben",     "acht",    "neun",     "zehn", _
     "elf",  "zwölf",    "dreizehn", "vierzehn", "fünfzehn", _
     "sechszehn", "siebzehn", "achtzehn", "neunzehn", "zwanzig")
     
  sTenWords() = Array( "", "zehn", "zwanzig", "dreißig", "vierzig", _
                       "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig")
     
  eins = "j"
  s = ""
  If n > 99 Then
    hhh = sOneWords(Fix(n / 100)) & "hundert"
    n = n MOD 100
    If n = 0 Then
      SmallIntToText = hhh
      Exit Function
    End If
  End If

  If (n > 20) Then
    eins = "n"
    zz = sTenWords(Fix(n / 10))
    If Right(Str(n),1) <> "0" Then zz = "und" & zz     
    n = n MOD 10
    If n = 0 Then
      If Right(Str(zz),2) = "01" Then zz = zz & "s"
      SmallIntToText = hhh & zz
      Exit Function
    End If
  End If
  If n = 1 Then
    If eins = "j" Then zz = zz & "s"
  End If
  SmallIntToText = hhh & sOneWords(n) & zz
End Function

Verfasst: Do, 24.05.2007 22:38
von Karolus
Hallo

Dafür daß du das zum ersten mal machst, ist das eine tolle Leistung, aber:
1000 ergibt immer noch Einstausend - eliminierst du den Fehler auch noch :-)

Gruß Karo

Verfasst: Fr, 25.05.2007 17:50
von mlebek
Es wird jetzt folgendermaßen generiert, ich hoffe mal dass man das so schreiben kann:

1 -> Ein
1001 -> Eintausendein

Code: Alles auswählen

Function InWorten(ByVal n) As String
  REM by Andrew D. Pitonyak
  Dim sBigWordsDE()

  REM 10^100 is a googol (10 duotrigintillion)
  REM This goes to 10^303, how big do you really want me to go?

  sBigWordsDE() = Array( "", "tausend","million", _
     "milliarde", "billion", "billiarde", "trillion", "Trilliarde", _
     "Quadrillion", "Quadrilliarde", "Quintillion", "Quintilliarde", _
     "Sextillion", "Sextilliarde", "Septillion", "Septilliarde", _
     "Oktillion", "Oktilliarde", "Nonillion", "Nonilliarde", _
     "Dezillion", "Dezilliarde", "Undezillion", "Undezilliarde", _
     "Duodezillion", "Doudezilliarde", "Tredezillion", _
     "Tredizilliarde", "Quattuordezillion", "Quattuordezilliarde", _
     "Quindezillion", "Quindezilliarde", "Sexdezillion", _
     "Sexdezilliarde", "Septendezillion", "Septendezilliarde", _
     "Oktodezillion", "Oktodezilliarde", "Novemdezillion", _
     "Novemdezilliarde", "Vigintillion", "Vigintilliarde", _
     "Unvigintillion", "Unvigintilliarde", "Duovigintillion", _
     "Duovigintilliarde", "Trevigintillion", "Trevigintilliarde", _
     "Quattuorvigintillion", "Quattuorvigintilliarde", "Quinvigintillion", _
     "Quinvigintilliarde", "Sexvigintillion", "Sexvigintilliarde", _
     "Septenvigintillion", "Septenvigintilliarde", "Oktovigintillion", _
     "Oktovigintilliarde", "Novemvigintillion", "Novemvigintilliarde", _
     "Trigintillion", "Trigintilliarde", "Untrigintillion", _
     "Untrigintilliarde", "Duotrigintillion", "Duotrigintilliarde", _
     "Tretrigintillion", "Tretrigintilliarde", "Quattuortrigintillion", _
     "Quattuortrigintilliarde", "Quintrigintillion", "Quintrigintilliarde", _
     "Sextrigintillion", "Sextrigintilliarde", "Septentrigintillion", _
     "Septentrigintilliarde", "Oktotrigintillion", "Oktotrigintilliarde", _
     "Novemtrigintillion", "Novemtrigintilliarde", "Quadragintillion", _
     "Quadragintilliarde", "Unquadragintillion", "Unquadragintilliarde", _
     "Duoquadragintillion", "Duoquadragintilliarde", "Trequadragintillion", _
     "Trequadragintilliarde", "Quattuorquadragintillion", _
     "Quattuorquadragintilliarde", "Quinquadragintillion", _
     "Quinquadragintilliarde", "Sexquadragintillion", _
     "Sexquadragintilliarde", "Septenquadragintillion", _
     "Septenquadragintilliarde", "Oktoquadragintillion", _
     "Oktoquadragintilliarde", "Novemquadragintillion", _
     "Novemquadragintilliarde", "Quinquagintillion", "Quinquagintilliarde" _
  )

  Dim i As Integer
  Dim iInt As Integer
  Dim s As String
  Dim dInt As Double
  Dim textklein As String
  Dim ersterbuchstabe As String
     
  If n = 0 Then
    InWorten = "" 
    Exit Function
  End If 
  REM Chop off the decimal portion.
  dInt = Fix(n)
  If (dInt < 1000) Then
    textklein = SmallIntToText(CInt(dInt))
    ersterbuchstabe = Ucase(Left(textklein,1)
    InWorten = ersterbuchstabe & Right(textklein,Len(textklein)-1)
    Exit Function
  End If

  REM i is the index into the sBigWords array
  i = 0
  s = ""
  Do While dInt > 0
    iInt = CInt(dInt - Fix(dInt / 1000) * 1000)
    If iInt <> 0 Then
      REM If Len(s) > 0 Then s = " " & s
      s = SmallIntToText(iInt) & sBigWordsDE(i) & s
    End If
    i = i + 1
    dInt = Fix(dInt / 1000)
    'Print "s = " & s & " dInt = " & dInt
  Loop
  REM If Right(Str(n),1) = "1" Then s = s & "s"
  textklein = s
  ersterbuchstabe = Ucase(Left(textklein,1)
  InWorten = ersterbuchstabe & Right(textklein,Len(textklein)-1)
End Function

Function SmallIntToText(ByVal n As Integer) As String
  REM by Andrew D. Pitonyak
  Dim sOneWords()
  Dim sTenWords()
  Dim s As String
  Dim eins As String

  If n > 999 Then
    Print "Achtung, n = " & n & " was zu gross ist!"
    Exit Function
  End If

  sOneWords() = Array ("", _
     "ein",     "zwei",       "drei",    "vier",     "fünf", _
     "sechs",     "sieben",     "acht",    "neun",     "zehn", _
     "elf",  "zwölf",    "dreizehn", "vierzehn", "fünfzehn", _
     "sechszehn", "siebzehn", "achtzehn", "neunzehn", "zwanzig")
     
  sTenWords() = Array( "", "zehn", "zwanzig", "dreißig", "vierzig", _
                       "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig")
     
  eins = "j"
  s = ""
  If n > 99 Then
    hhh = sOneWords(Fix(n / 100)) & "hundert"
    n = n MOD 100
    If n = 0 Then
      SmallIntToText = hhh
      Exit Function
    End If
  End If

  If (n > 20) Then
    eins = "n"
    zz = sTenWords(Fix(n / 10))
    If Right(Str(n),1) <> "0" Then zz = "und" & zz     
    n = n MOD 10
    If n = 0 Then
      If Right(Str(zz),2) = "01" Then zz = zz & "s"
      SmallIntToText = hhh & zz
      Exit Function
    End If
  End If
  REM If n = 1 Then
  REM   If eins = "j" Then zz = zz & "s"
  REM  End If
  SmallIntToText = hhh & sOneWords(n) & zz
End Function