NumeracionJaponesa.vb

  1. ' NumeracionJaponesa.vb — ProInf.net — 26-feb-2012
  2. '
  3. ' http://es.wikipedia.org/wiki/Numeración_japonesa
  4.  
  5. Public Class NumeracionJaponesa
  6.  
  7. 'Ejemplos:
  8. ' 11 = jū-ichi
  9. ' 17 = jū-nana
  10. ' 151 = hyaku go-jū ichi
  11. ' 302 = san-hyaku ni
  12. ' 469 = yon-hyaku roku-jū kyū
  13. ' 2025 = ni-sen ni-jū go
  14. ' 1'0000 = ichi-man
  15. ' 983'6703 = kyū-hyaku hachi-jū san man roku-sen nana-hyaku san
  16. ' 20'3652'1801 = ni-jū oku san-zen rop-pyaku go-jū ni-man sen hap-pyaku ichi
  17. ' 10'0000 = jū-man
  18.  
  19. ' 0..9
  20. Private Shared unidades As String() = {
  21. "zero", "ichi", "ni", "san", "yon", "go", "roku", "nana", "hachi", "kyū"
  22. }
  23.  
  24. 'Potencia: 1, 10, 100, 1000
  25. Private Shared potencias As String() = {
  26. "", "jū", "hyaku", "sen"
  27. }
  28.  
  29. 'Miriadas: 10^0, 10^4, 10^8, 10^12,... 10^72
  30. Private Shared escalas As String() = {
  31. "", "man", "oku", "chō", "kei", "gai", "jo", "jō", "kō", "kan", "sei", "sai",
  32. "goku", "gōgasha", "asōgi", "nayuta", "fukashigi", "muryō", "taisū"
  33. }
  34.  
  35. Private Shared modificaciones As New ModificacionesFoneticas()
  36.  
  37. Private Class ModificacionesFoneticas
  38. Inherits Dictionary(Of String, String)
  39. Public Sub New()
  40. Add("san-hyaku", "sanbyaku") '300
  41. Add("roku-hyaku", "roppyaku") '600
  42. Add("hachi-hyaku", "happyaku") '800
  43. Add("san-sen", "sanzen") '3000
  44. Add("hachi-sen", "hassen") '8000
  45. End Sub
  46. Public Function Reemplazar(ByVal texto As String) As String
  47. Dim enumerador As IDictionaryEnumerator = Me.GetEnumerator()
  48. Do While enumerador.MoveNext()
  49. texto = texto.Replace(enumerador.Key, enumerador.Value)
  50. Loop
  51. Return texto
  52. End Function
  53. End Class
  54.  
  55. Public Shared Function Obtener(ByVal numero As Integer) As String
  56. If numero = 0 Then Return unidades(0)
  57.  
  58. Dim resultado As New System.Text.StringBuilder()
  59. Dim potenciaMiriada As Integer = 0
  60.  
  61. Do While numero > 0
  62. Dim miriada = numero Mod 10000
  63.  
  64. If resultado.Length > 0 Then resultado.Insert(0, " ")
  65. If potenciaMiriada > 0 Then
  66. resultado.Insert(0, ObtenerEscala(potenciaMiriada))
  67. If miriada <= 10 Or miriada = 100 Or miriada = 1000 Then
  68. resultado.Insert(0, "-")
  69. Else
  70. resultado.Insert(0, " ")
  71. End If
  72. End If
  73. resultado.Insert(0, ObtenerMiriada(miriada))
  74.  
  75. numero \= 10000
  76. potenciaMiriada += 1
  77. Loop
  78. Return resultado.ToString()
  79. End Function
  80.  
  81. 'Número entre 1 y 9999
  82. Public Shared Function ObtenerMiriada(ByVal numero As Integer) As String
  83. Dim resultado As New System.Text.StringBuilder()
  84. Dim potenciaDiez As Integer = 0
  85.  
  86. Do While numero > 0
  87. Dim digitoDecimal = numero Mod 10
  88.  
  89. If digitoDecimal <> 0 Then
  90. If potenciaDiez = 0 Then
  91. resultado.Insert(0, ObtenerUnidad(digitoDecimal))
  92. Else
  93. If resultado.Length > 0 Then
  94. If potenciaDiez = 1 And digitoDecimal = 1 Then
  95. resultado.Insert(0, "-")
  96. Else
  97. resultado.Insert(0, " ")
  98. End If
  99. End If
  100. resultado.Insert(0, ObtenerPotencia(potenciaDiez))
  101. If digitoDecimal > 1 Then
  102. resultado.Insert(0, "-")
  103. resultado.Insert(0, ObtenerUnidad(digitoDecimal))
  104. End If
  105. End If
  106. End If
  107.  
  108. numero \= 10
  109. potenciaDiez += 1
  110. Loop
  111. Return modificaciones.Reemplazar(resultado.ToString())
  112. End Function
  113.  
  114. Private Shared Function ObtenerUnidad(ByVal digito As Integer) As String
  115. If digito >= 1 And digito <= 9 Then
  116. Return unidades(digito)
  117. Else
  118. Return ""
  119. End If
  120. End Function
  121.  
  122. Private Shared Function ObtenerPotencia(ByVal potencia As Integer) As String
  123. If potencia >= 0 And potencia <= potencias.Length Then
  124. Return potencias(potencia)
  125. Else
  126. Return "?"
  127. End If
  128. End Function
  129.  
  130. Private Shared Function ObtenerEscala(ByVal escala As Integer) As String
  131. If escala >= 0 And escala <= escalas.Length Then
  132. Return escalas(escala)
  133. Else
  134. Return "?"
  135. End If
  136. End Function
  137.  
  138. End Class
  139.  
  140. 'Public Class Alfajapones
  141. ' Private Shared japones = {"Ē", "Bī", "Shī", "Dī", "Ī", "Efu",
  142. ' "Jī", "Eichi", "Ai", "Jē", "Kē", "Eru", "Emu", "Enu", "Ō",
  143. ' "Pī", "Kyū", "Āru", "Esu", "Tī", "Yū", "Vi", "Daburyū",
  144. ' "Ekkusu", "Wai", "Zetto"}
  145. 'End Class

Proinf.net