Zahlen als Wort ausgeben

    • VB.NET

    Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      Zahlen als Wort ausgeben

      Hab mich mal dran verkünstelt:

      VB.NET-Quellcode

      1. Public Function NumberWord(n As Integer) As String
      2. Select Case n
      3. Case Is < Integer.MinValue + 2, Integer.MaxValue
      4. Throw New ArgumentOutOfRangeException("n", n, String.Format("valid range is: -{0} to {0}", Integer.MaxValue - 1))
      5. Case 0 : Return "null"
      6. Case Is < 0 : Return "minus " & NumberWord(-n)
      7. End Select
      8. NumberWord = NumberWordRecursive(n)
      9. Dim zehner, einer As Integer
      10. zehner = Math.DivRem(n, 10, einer)
      11. ' "s" anhängen, wenn keine zehner-stelle, und einer = 1 - zB 1, 101, 1001, 2501 ...
      12. If (zehner Mod 10) = 0 AndAlso einer = 1 Then NumberWord &= "s"
      13. End Function
      14. Private Function NumberWordRecursive(n As Integer) As String
      15. Dim einer = "##invalid ein zwei drei vier fünf sechs sieben acht neun zehn elf zwölf".Split
      16. Dim zehner = "##invalid zehn zwanzig dreißig vierzig fünfzig sechzig siebzig achzig neunzig".Split
      17. Dim dimension = {New With {.n = 100, .text = "##invalid"},
      18. New With {.n = 1000, .text = "hundert"},
      19. New With {.n = 1000000, .text = "tausend"},
      20. New With {.n = 1000000000, .text = "millionen"},
      21. New With {.n = Integer.MaxValue, .text = "milliarden"}}
      22. Dim geteilt, rest As Integer
      23. geteilt = Math.DivRem(n, 10, rest)
      24. Select Case n
      25. Case 0 : Return ""
      26. Case Is < 13 : Return einer(n)
      27. Case Is < 20 : Return einer(rest) & zehner(1)
      28. Case Is < 100
      29. If rest = 0 Then Return zehner(geteilt)
      30. 'wenn Einer da sind, vertauschte Reihenfolge
      31. Return einer(rest) & "und" & zehner(geteilt)
      32. Case Else
      33. Dim i = Array.FindIndex(dimension, Function(itm) n < itm.n)
      34. geteilt = Math.DivRem(n, dimension(i - 1).n, rest)
      35. NumberWordRecursive = NumberWordRecursive(geteilt) & dimension(i).text & NumberWordRecursive(rest)
      36. If i > 2 AndAlso geteilt = 1 Then
      37. Select Case i 'singular bei millionen/milliarden
      38. Case 3
      39. NumberWordRecursive = NumberWordRecursive.Remove(10, 2).Insert(3, "e")
      40. Case 4
      41. NumberWordRecursive = NumberWordRecursive.Remove(12, 1).Insert(3, "e")
      42. End Select
      43. End If
      44. End Select
      45. End Function
      46. Private Sub Test()
      47. ' paar interessante Zahlen
      48. For Each i In {0, 1, 125, 1000000, 1000000000, 1000100000, 100010000, 101001, 1021, 3333, 1123456, 3123456, Integer.MaxValue - 1}
      49. Console.WriteLine(NumberWord(i))
      50. Next
      51. End
      52. End Sub
      Man könnte auch noch was mit mit Runden, oder mit Nachkommastellen machen.
      Ich denke aber, das sollte man eher als abgetrennte Funktion angehen. Etwa Runden hat ja nichts mit Zahlworten zu tun, und wenn man tatsächlich die Cents auf dem Scheck aufführen will, kann man die 2 Nachkommastellen ja nochmal extra durchlaufen lassen.

      Am Algo-Konzept hat mich überrascht, wie systematisch die Grammatik eiglich ist, und insbesondere rekursiv: Die Regeln für milliardener, millionener, tausender, hunderter sind immer dieselben.
      Und das unregelmäßige Zeugs im Bereich unter hundert wiederholt sich - absolut regelmäßig - auf den höheren Ebenen - Rekursion eben.
      ZB um die Zahl 125125125 zu "sagen", wird das Wort "einhundertfünfundzwanzig" drei mal gebildet, und es wird halt "millionen" und "tausend" eingefügt:
      einhundertfünfundzwanzigmillioneneinhundertfünfundzwanzigtausendeinhundertfünfundzwanzig

      Technisch gesehen setze ich v.a. 2 String-Arrays ein, und ein Array von anonymen Datentypen.

      Auch verwende ich die weniger bekannte Math.DivRem() - Methode, eine Art mächtigeres Modulo, weils den Rest der Teilung nicht verfallen lässt.
      Und Array.FindIndex() mit anonymer Methode - kennen vmtl. auch nur Leute, die gelegentlich browsen im Framework - mittm ObjectBrowser ;)

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

      ErfinderDesRades schrieb:

      magste dein Werk vlt. hier anhängen? Zahlen als Wort ausgeben

      Weil du hast mich widerlegt in dem Punkt, dass sowas rekursiv zu lösen ist.
      Es einfach iterativ in 3er-Schritten lösbar.

      Ursprung

      VB.NET-Quellcode

      1. ''' <summary>
      2. ''' Diese Methode wandelt in 3 Schritten eine Zahl in einen alphabetischen Wortlaut um
      3. ''' </summary>
      4. Private Function NumberWord(number As Decimal) As String
      5. Dim listNum As New List(Of String)
      6. Dim einer = "? Ein Zwei Drei Vier Fünf Sechs Sieben Acht Neun".Split
      7. Dim zehner = "? Zehn Zwanzig Dreißig Vierzig Fünfzig Sechzig Siebzig Achzig Neunzig".Split
      8. Dim deci = "? Tausend Millionen Milliarden Billionen Billiarden Trillionen Trilliarden Quadrillionen Quadrilliarden".Split
      9. 'Schritt 1: der Zahlenstring wird nach Hunderterschritten (3 Stellen) von hinten nach vorne zerlegt und in eine Liste abgelegt
      10. Dim tmpNr = number.ToString
      11. For i = tmpNr.Length To 0 Step -3
      12. Dim tmp = tmpNr.Substring(If(i < 3, 0, i - 3), If(i < 3, i, 3))
      13. If Not String.IsNullOrEmpty(tmp) Then listNum.Add(tmp)
      14. Next
      15. 'Schritt 2: (Haupteil) alle 3 stelligen Teilstrings werden von nummerischen in alphabetischen Wortlaut umgewandelt und wieder in die selbe Liste eingetragen
      16. For i = 0 To listNum.Count - 1
      17. tmpNr = ""
      18. Dim n = listNum(i).PadLeft(3, "0"c)
      19. Dim h = n.Substring(0, 1)
      20. Dim e = If(n.Length - 1 > 1, n.Substring(2, 1), "0"c)
      21. Dim z = If(n.Length - 1 > 0, n.Substring(1, 1), "0"c)
      22. If h <> "0"c Then tmpNr = einer(CInt(h)) & "Hundert"
      23. If e <> "0"c Then tmpNr &= einer(CInt(e)) & "Und"
      24. If z <> "0"c Then tmpNr &= zehner(CInt(z))
      25. If String.IsNullOrEmpty(tmpNr) Then tmpNr = "?"c
      26. 'diverse notwendige Wortlautkorrekturen
      27. tmpNr = tmpNr.Replace("EinUndZehn", "Elf")
      28. tmpNr = tmpNr.Replace("ZweiUndZehn", "Zwölf")
      29. tmpNr = tmpNr.Replace("UndZehn", "Zehn")
      30. tmpNr = tmpNr.Replace("SechsZehn", "Sechzehn")
      31. tmpNr = tmpNr.Replace("SiebenZehn", "Siebzehn")
      32. If tmpNr.EndsWith("Und") Then tmpNr = tmpNr.Replace("Und", "")
      33. 'am Ende der Zahl sagt man nicht EIN sondern EINS
      34. If i = 0 AndAlso tmpNr.EndsWith("Ein") Then tmpNr = tmpNr & "s"c
      35. 'am Anfang der Zahl sagt man nicht EIN sondern EINE (außer bei HUNDERT, da sagt man nicht EINE)
      36. If i = listNum.Count - 1 AndAlso listNum.Count - 1 > 1 AndAlso tmpNr.StartsWith("Ein") AndAlso Not tmpNr.Contains("Hundert") Then tmpNr = tmpNr.Insert(3, "e"c)
      37. listNum(i) = tmpNr
      38. Next
      39. 'Schritt 3: Verkettung aller Teilstrings zu einem ganzen Wortlaut der angegeben Zahl
      40. tmpNr = ""
      41. For i = listNum.Count - 1 To 0 Step -1
      42. Dim tmp = If(listNum(i) = "?"c, "", listNum(i) & deci(i))
      43. 'Bei EINE auf singulare Darstellung umwandeln
      44. If tmp.StartsWith("Eine") AndAlso tmp.EndsWith("nen") Then tmp = tmp.Substring(0, tmp.Length - 2)
      45. If tmp.StartsWith("Eine") AndAlso tmp.EndsWith("den") Then tmp = tmp.Substring(0, tmp.Length - 1)
      46. tmpNr &= tmp
      47. Next
      48. tmpNr = tmpNr.Replace("?"c, "")
      49. If String.IsNullOrEmpty(tmpNr) Then tmpNr = "Null"
      50. Return tmpNr
      51. End Function

      EDIT:
      mit Kommentar und Rechtschreibfehlerkorrektur :)
      Codekorrekturen wegen noch kleiner fehlerhafter Ausgaben
      @petaod und @ErfinderDesRades Danke für eure Hinweise... :)

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „VB1963“ ()

      Funktioniert gut bis auf einen Schönheitsfehler:
      Quadrillionen und Quadrilliarden
      de.wikipedia.org/wiki/Zahlenna…e_und_dar.C3.BCber_hinaus


      Edit:
      Sechzehn und Siebzehn werden auch nur fast richtig abgebildet ;)
      Hier die Liste der Ausnahmen:
      de.wikipedia.org/wiki/Zahlenna…egelm.C3.A4.C3.9Figkeiten

      --
      If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
      --

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

      Ich habe noch ein kleinen Fehler entdeckt und die Funktion etwas erweitert. Es hat mir auf jedenfall viel Zeit erspart. Vielen Dank an @VB1963.


      VB.NET-Quellcode

      1. Public Module DecimalExtensions
      2. Public Enum WordFormat
      3. ToLower
      4. ToUpper
      5. ToFirstLetterUpper
      6. ToEachNumberUpper
      7. End Enum
      8. ''' <summary>
      9. ''' Diese Methode wandelt in 3 Schritten eine Zahl in einen alphabetischen Wortlaut um
      10. ''' </summary>
      11. ''' <param name="number">The number.</param>
      12. ''' <returns>Die Zahl in Worten</returns>
      13. ''' <see cref="https://www.vb-paradise.de/index.php/Thread/115708-Zahlen-als-Wort-ausgeben/?postID=1007998#post1007998"/>
      14. <Extension()>
      15. Public Function ToWord(number As Decimal, Optional format As WordFormat = WordFormat.ToEachNumberUpper) As String
      16. Dim listNum As New List(Of String)
      17. Dim einer = "? Ein Zwei Drei Vier Fünf Sechs Sieben Acht Neun".Split
      18. Dim zehner = "? Zehn Zwanzig Dreißig Vierzig Fünfzig Sechzig Siebzig Achtzig Neunzig".Split
      19. Dim deci = "? Tausend Millionen Milliarden Billionen Billiarden Trillionen Trilliarden Quadrillionen Quadrilliarden".Split
      20. 'Schritt 1: der Zahlenstring wird nach Hunderterschritten (3 Stellen) von hinten nach vorne zerlegt und in eine Liste abgelegt
      21. Dim tmpNr = number.ToString
      22. For i = tmpNr.Length To 0 Step -3
      23. Dim tmp = tmpNr.Substring(If(i < 3, 0, i - 3), If(i < 3, i, 3))
      24. If Not String.IsNullOrEmpty(tmp) Then listNum.Add(tmp)
      25. Next
      26. 'Schritt 2: (Haupteil) alle 3 stelligen Teilstrings werden von nummerischen in alphabetischen Wortlaut umgewandelt und wieder in die selbe Liste eingetragen
      27. For i = 0 To listNum.Count - 1
      28. tmpNr = ""
      29. Dim n = listNum(i).PadLeft(3, "0"c)
      30. Dim h = n.Substring(0, 1)
      31. Dim e = If(n.Length - 1 > 1, n.Substring(2, 1), "0"c)
      32. Dim z = If(n.Length - 1 > 0, n.Substring(1, 1), "0"c)
      33. If h <> "0"c Then tmpNr = einer(CInt(h.ToString)) & "Hundert"
      34. If e <> "0"c Then tmpNr &= einer(CInt(e.ToString)) & "Und"
      35. If z <> "0"c Then tmpNr &= zehner(CInt(z.ToString))
      36. If String.IsNullOrEmpty(tmpNr) Then tmpNr = "?"c
      37. 'diverse notwendige Wortlautkorrekturen
      38. tmpNr = tmpNr.Replace("EinUndZehn", "Elf")
      39. tmpNr = tmpNr.Replace("ZweiUndZehn", "Zwölf")
      40. tmpNr = tmpNr.Replace("UndZehn", "Zehn")
      41. tmpNr = tmpNr.Replace("SechsZehn", "Sechzehn")
      42. tmpNr = tmpNr.Replace("SiebenZehn", "Siebzehn")
      43. If tmpNr.EndsWith("Und") Then tmpNr = tmpNr.Replace("Und", "")
      44. 'am Ende der Zahl sagt man nicht EIN sondern EINS
      45. If i = 0 AndAlso tmpNr.EndsWith("Ein") Then tmpNr = tmpNr & "s"c
      46. 'am Anfang der Zahl sagt man nicht EIN sondern EINE (außer bei HUNDERT, da sagt man nicht EINE)
      47. If i = listNum.Count - 1 AndAlso listNum.Count - 1 > 1 AndAlso tmpNr.StartsWith("Ein") AndAlso Not tmpNr.Contains("Hundert") Then tmpNr = tmpNr.Insert(3, "e"c)
      48. listNum(i) = tmpNr
      49. Next
      50. 'Schritt 3: Verkettung aller Teilstrings zu einem ganzen Wortlaut der angegeben Zahl
      51. tmpNr = ""
      52. For i = listNum.Count - 1 To 0 Step -1
      53. Dim tmp = If(listNum(i) = "?"c, "", listNum(i) & deci(i))
      54. 'Bei EINE auf singulare Darstellung umwandeln
      55. If tmp.StartsWith("Eine") AndAlso tmp.EndsWith("nen") Then tmp = tmp.Substring(0, tmp.Length - 2)
      56. If tmp.StartsWith("Eine") AndAlso tmp.EndsWith("den") Then
      57. 'tmp = tmp.Substring(0, tmp.Length - 1)
      58. tmp = tmp.Substring(0, 3) & tmp.Substring(4)
      59. End If
      60. tmpNr &= tmp
      61. Next
      62. tmpNr = tmpNr.Replace("?"c, "")
      63. If String.IsNullOrEmpty(tmpNr) Then tmpNr = "Null"
      64. Select Case format
      65. Case WordFormat.ToLower
      66. tmpNr = tmpNr.ToLower()
      67. Case WordFormat.ToUpper
      68. tmpNr = tmpNr.ToUpper()
      69. Case WordFormat.ToFirstLetterUpper
      70. tmpNr = tmpNr.Substring(0, 1) & tmpNr.ToLower().Substring(1)
      71. End Select
      72. Return tmpNr
      73. End Function
      74. End Module
      Das habe ich auch schonmal programmiert und den Code tatsächlich noch gefunden. Könnt ja mal schauen, ob ihr Fehler findet ;)

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Public Class NumericalValue
      2. Public Enum Stellenwert
      3. Einer
      4. Zehner
      5. Hunderter
      6. End Enum
      7. Public Shared Function AsWord(Value As String) As String
      8. Dim Text As String = String.Empty
      9. Dim SkipNext As Boolean = False
      10. Dim isSingle As Boolean = False
      11. Dim isDigit As Boolean = False
      12. Dim isSmall As Boolean = False
      13. Dim CurrentPos As Stellenwert = Stellenwert.Einer
      14. Select Case Value.Length Mod 3
      15. Case 0
      16. CurrentPos = Stellenwert.Hunderter
      17. Case 1
      18. CurrentPos = Stellenwert.Einer
      19. Case 2
      20. CurrentPos = Stellenwert.Zehner
      21. End Select
      22. If Value = "0" Then
      23. Return "Null"
      24. End If
      25. For i = 0 To Value.Length - 1
      26. If Not SkipNext Then
      27. Dim Current As Integer = i
      28. If Value.Length - Current > 6 Then
      29. isSmall = False
      30. Else
      31. isSmall = True
      32. End If
      33. If CurrentPos = Stellenwert.Zehner Then
      34. If Value(Current) = "0"c Then
      35. isSingle = True
      36. isDigit = (Value.Length - 1 - Current = 0)
      37. Text &= GetSubString(CInt(CStr(Value(Current + 1))), Stellenwert.Einer, isSmall, isSingle, isDigit)
      38. SkipNext = True
      39. Else
      40. Text &= GetSubString(CInt(CStr(Value(Current + 1))), Stellenwert.Einer, isSmall, False, False)
      41. SkipNext = True
      42. End If
      43. ElseIf CurrentPos = Stellenwert.Einer Then
      44. isSingle = True
      45. If Value.Length = 1 Then
      46. isDigit = True
      47. Else
      48. isDigit = False
      49. End If
      50. Else
      51. isSingle = False
      52. isDigit = False
      53. End If
      54. Text &= GetSubString(CInt(CStr(Value(Current))), CurrentPos, isSmall, isSingle, isDigit)
      55. Select Case CurrentPos
      56. Case Stellenwert.Hunderter
      57. CurrentPos = Stellenwert.Zehner
      58. Case Stellenwert.Zehner
      59. If SkipNext Then
      60. Dim Trenner = GetTrenner(Value.Length - (Current + 1))
      61. If Current > 0 AndAlso Value(Current - 1) = "0"c AndAlso Value(Current) = "0"c AndAlso Value(Current + 1) = "1"c Then
      62. Trenner = Trenner.Replace("lionen", "lion").Replace("liarden", "liarde")
      63. End If
      64. Text &= Trenner
      65. CurrentPos = Stellenwert.Hunderter
      66. Else
      67. CurrentPos = Stellenwert.Einer
      68. End If
      69. Case Stellenwert.Einer
      70. Dim Trenner = GetTrenner(Value.Length - (Current))
      71. If Value(Current) = "1"c Then
      72. Trenner = Trenner.Replace("lionen", "lion").Replace("liarden", "liarde")
      73. End If
      74. Text &= Trenner
      75. CurrentPos = Stellenwert.Hunderter
      76. End Select
      77. Else
      78. SkipNext = False
      79. End If
      80. Next
      81. Text = Text.Replace("einundzehn", "elf").Replace("zweiundzehn", "zwölf").Replace("dreiundzehn", "dreizehn").Replace("vierundzehn", "vierzehn").Replace("fünfundzehn", "fünfzehn").Replace("sechsundzehn", "sechzehn").Replace("siebenundzehn", "siebzehn").Replace("achtundzehn", "achtzehn").Replace("neunundzehn", "neunzehn")
      82. If Not String.IsNullOrWhiteSpace(Text) Then
      83. Text = Text.Substring(0, 1).ToUpper & Text.Substring(1)
      84. End If
      85. Return Text
      86. End Function
      87. Private Shared Function GetSubString(Value As Integer, CurrentPos As Stellenwert, IsSmall As Boolean, isSingle As Boolean, isDigit As Boolean) As String
      88. Select Case Value
      89. Case 1
      90. If Not isSingle Then
      91. Select Case CurrentPos
      92. Case Stellenwert.Einer
      93. Return "einund"
      94. Case Stellenwert.Zehner
      95. Return "zehn"
      96. Case Stellenwert.Hunderter
      97. Return "einhundert"
      98. End Select
      99. Else
      100. If isDigit Then
      101. Return "eins"
      102. Else
      103. If IsSmall Then
      104. Return "ein"
      105. Else
      106. Return "eine"
      107. End If
      108. End If
      109. End If
      110. Case 2
      111. If Not isSingle Then
      112. Select Case CurrentPos
      113. Case Stellenwert.Einer
      114. Return "zweiund"
      115. Case Stellenwert.Zehner
      116. Return "zwanzig"
      117. Case Stellenwert.Hunderter
      118. Return "zweihundert"
      119. End Select
      120. Else
      121. Return "Zwei"
      122. End If
      123. Case 3
      124. If Not isSingle Then
      125. Select Case CurrentPos
      126. Case Stellenwert.Einer
      127. Return "dreiund"
      128. Case Stellenwert.Zehner
      129. Return "dreißig"
      130. Case Stellenwert.Hunderter
      131. Return "dreihundert"
      132. End Select
      133. Else
      134. Return "drei"
      135. End If
      136. Case 4
      137. If Not isSingle Then
      138. Select Case CurrentPos
      139. Case Stellenwert.Einer
      140. Return "vierund"
      141. Case Stellenwert.Zehner
      142. Return "vierzig"
      143. Case Stellenwert.Hunderter
      144. Return "vierhundert"
      145. End Select
      146. Else
      147. Return "vier"
      148. End If
      149. Case 5
      150. If Not isDigit Then
      151. Select Case CurrentPos
      152. Case Stellenwert.Einer
      153. Return "fünfund"
      154. Case Stellenwert.Zehner
      155. Return "fünfzig"
      156. Case Stellenwert.Hunderter
      157. Return "fünfhundert"
      158. End Select
      159. Else
      160. Return "fünf"
      161. End If
      162. Case 6
      163. If Not isDigit Then
      164. Select Case CurrentPos
      165. Case Stellenwert.Einer
      166. Return "sechsund"
      167. Case Stellenwert.Zehner
      168. Return "sechszig"
      169. Case Stellenwert.Hunderter
      170. Return "sechshundert"
      171. End Select
      172. Else
      173. Return "sechs"
      174. End If
      175. Case 7
      176. If Not isDigit Then
      177. Select Case CurrentPos
      178. Case Stellenwert.Einer
      179. Return "siebenund"
      180. Case Stellenwert.Zehner
      181. Return "siebzig"
      182. Case Stellenwert.Hunderter
      183. Return "siebenhundert"
      184. End Select
      185. Else
      186. Return "sieben"
      187. End If
      188. Case 8
      189. If Not isDigit Then
      190. Select Case CurrentPos
      191. Case Stellenwert.Einer
      192. Return "achtund"
      193. Case Stellenwert.Zehner
      194. Return "achtzig"
      195. Case Stellenwert.Hunderter
      196. Return "achthundert"
      197. End Select
      198. Else
      199. Return "acht"
      200. End If
      201. Case 9
      202. If Not isDigit Then
      203. Select Case CurrentPos
      204. Case Stellenwert.Einer
      205. Return "neunund"
      206. Case Stellenwert.Zehner
      207. Return "neunzig"
      208. Case Stellenwert.Hunderter
      209. Return "neunhundert"
      210. End Select
      211. Else
      212. Return "neun"
      213. End If
      214. Case Else
      215. Return String.Empty
      216. End Select
      217. Return String.Empty
      218. End Function
      219. Private Shared Function GetTrenner(Current As Integer) As String
      220. Select Case Current
      221. Case 4
      222. Return "tausend"
      223. Case 7
      224. Return "millionen"
      225. Case 10
      226. Return "milliarden"
      227. Case 13
      228. Return "billionen"
      229. Case 16
      230. Return "billiarden"
      231. Case 19
      232. Return "trillionen"
      233. Case 22
      234. Return "trilliarden"
      235. Case 25
      236. Return "quadrillionen"
      237. Case 28
      238. Return "quadrilliarden"
      239. Case 31
      240. Return "quintillionen"
      241. Case 34
      242. Return "quintilliarden"
      243. Case 37
      244. Return "sextillionen"
      245. Case 40
      246. Return "sextilliarden"
      247. Case 43
      248. Return "septillionen"
      249. Case 46
      250. Return "septilliarden"
      251. Case 49
      252. Return "oktillionen"
      253. Case 52
      254. Return "oktilliarden"
      255. Case 55
      256. Return "nonillionen"
      257. Case 58
      258. Return "nonilliarden"
      259. Case 61
      260. Return "dezillionen"
      261. Case 64
      262. Return "dezilliarden"
      263. Case 67
      264. Return "undezillionen"
      265. Case 70
      266. Return "undezilliarden"
      267. Case 73
      268. Return "dodezillionen"
      269. Case 76
      270. Return "dodezilliarden"
      271. Case 79
      272. Return "tredezillionen"
      273. Case 82
      274. Return "tredezilliarden"
      275. Case 85
      276. Return "quattuordezillionen"
      277. Case 88
      278. Return "quattuordezilliarden"
      279. Case 91
      280. Return "quindezillionen"
      281. Case 94
      282. Return "quindezilliarden"
      283. Case 97
      284. Return "sedezillionen"
      285. Case 100
      286. Return "sedezilliarden"
      287. Case 103
      288. Return "septendezillionen"
      289. Case 106
      290. Return "septendezilliarden"
      291. Case 109
      292. Return "dodevigintillionen"
      293. Case 112
      294. Return "dodevigintilliarden"
      295. Case 115
      296. Return "undevigintillionen"
      297. Case 118
      298. Return "undevigintilliarden"
      299. Case 121
      300. Return "vigintillionen"
      301. Case 124
      302. Return "vigintilliarden"
      303. Case 127
      304. Return "unvigintillionen"
      305. Case 130
      306. Return "unvigintilliarden"
      307. Case 133
      308. Return "dovigintillionen"
      309. Case 136
      310. Return "dovigintilliarden"
      311. Case Else
      312. Return String.Empty
      313. End Select
      314. End Function
      315. End Class



      EDIT: Select Case angepasst. Danke für den Hinweis @RodFromGermany
      EDIT2: Fehlende Codezeile ergänzt. Danke @petaodvb-paradise.de/index.php/User/10037-RodFromGermany/



      Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Yanbel“ ()

      Yanbel schrieb:

      VB.NET-Quellcode

      1. Select Case True
      2. Case Value.Length Mod 3 = 0
      3. CurrentPos = Stellenwert.Hunderter
      4. Case Value.Length Mod 3 = 1
      5. CurrentPos = Stellenwert.Einer
      6. Case Value.Length Mod 3 = 2
      7. CurrentPos = Stellenwert.Zehner
      8. End Select
      Der springt mir aber ins Auge. :thumbsup:
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      @Yanbel Immer noch falsch, so sollte es wohl sein:

      VB.NET-Quellcode

      1. Select Case Value.Length Mod 3
      2. Case 0
      3. CurrentPos = Stellenwert.Hunderter
      4. Case 1
      5. CurrentPos = Stellenwert.Zehner
      6. Case 2
      7. CurrentPos = Stellenwert.Einer
      8. End Select

      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!

      petaod schrieb:

      ...rein optisch fällt mir auf, dass die Werte sechzehn, siebzehn, sechzig wohl nicht stimmen können.


      Stimmt. Da habe ich bei der letzten Anpassung ein bisschen zu viel Code entfernt. Ursprünglich hatte ich "einetrillionen" beispielsweise mit "einetrillion" replaced. Beim Umbau habe ich versehentlich auch die Replaces für "elf" und "zwölf" etc entfernt

      RodFromGermany schrieb:

      @Yanbel Immer noch falsch, so sollte es wohl sein:


      Wenn ich "23".Length mod 3 nehme dann ergibt das 2 und ich starte vorne mit einer Zehnerstelle und nicht mit einer Einerstelle. Oder denke ich gerade falsch?


      Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Yanbel“ ()

      Yanbel schrieb:

      Oder denke ich gerade falsch?
      Jou, ich hab nicht mitgedacht. :rolleyes:
      ====
      @Yanbel An so eine Stelle gehört im Quelltext ein guter Kommentar.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()