NumeracionLatin.vb

  1. ' NumeracionLatin.vb — ProInf.net — 29-feb-2012
  2. '
  3. ' El latín es una lengua itálica de la familia de las lenguas indoeuropeas.
  4. ' Aunque definida como muerta, todavía es uno de los idiomas co-oficiales del Vaticano
  5. ' (junto con el alemán, el francés y el italiano).
  6. ' Hablada en la antigua República Romana y el Imperio romano, del siglo II a. C. al siglo II d. C.,
  7. ' perduró durante la Edad Media.
  8. '
  9. ' http://www.wikiteka.com/apuntes/los-numeros-en-latin/
  10. ' http://www.languagesandnumbers.com/como-contar-en-latin/es/lat/
  11.  
  12. Public Class NumeracionLatin
  13. Private Shared _enNeutro As NumeracionLatinNeutro = Nothing
  14. Private Shared _enMasculino As NumeracionLatinMasculino = Nothing
  15. Private Shared _enFemenino As NumeracionLatinFemenino = Nothing
  16.  
  17. Public Shared Function ObtenerEnNeutro(ByVal numero As Decimal) As String
  18. If _enNeutro Is Nothing Then _enNeutro = New NumeracionLatinNeutro()
  19. Return _enNeutro.Obtener(numero)
  20. End Function
  21.  
  22. Public Shared Function ObtenerEnMasculino(ByVal numero As Decimal) As String
  23. If _enMasculino Is Nothing Then _enMasculino = New NumeracionLatinMasculino()
  24. Return _enMasculino.Obtener(numero)
  25. End Function
  26.  
  27. Public Shared Function ObtenerEnFemenino(ByVal numero As Decimal) As String
  28. If _enFemenino Is Nothing Then _enFemenino = New NumeracionLatinFemenino()
  29. Return _enFemenino.Obtener(numero)
  30. End Function
  31. End Class
  32.  
  33. '================================================
  34. ' NUMERACIÓN LATIN MASCULINO
  35.  
  36. Public Class NumeracionLatinMasculino
  37.  
  38. 'Rango entre 0 y 999.999
  39.  
  40. ' Ejemplos:
  41. ' 54 = quinquaginta quattuor
  42. ' 99 = undecentum
  43. ' 100 = centum
  44. ' 199 = centum undecentum
  45. ' 399 = trecenti undecentum
  46. ' 400 = quadringenti
  47. ' 576 = quingenti septuaginta sex
  48. ' 988 = nongenti duodenonaginta
  49. ' 998 = nongenti nonaginta octo
  50. ' 999 = nongenti undecentum
  51. ' 1000 = mille
  52. ' 1999 = mille nongenti undecentum
  53. ' 2000 = duo milia
  54. ' 4320 = quattuor milia trecenti viginti
  55. ' 9999 = novem milia nongenti undecentum
  56.  
  57. Public Function Obtener(ByVal numero As Integer) As String
  58. If numero >= 0 And numero <= 999999 Then
  59. Return ObtenerMiles(numero)
  60. Else
  61. Return "?"
  62. End If
  63. End Function
  64.  
  65. '0..999.999
  66. Protected Function ObtenerMiles(ByVal numero As Integer) As String
  67. Dim miles As Integer = numero \ 1000
  68. Dim resto As Integer = numero Mod 1000
  69. If miles = 0 Then
  70. Return ObtenerCentenas(resto)
  71. ElseIf resto = 0 Then
  72. Return ObtenerMillares(miles)
  73. Else
  74. Return String.Format("{0} {1}",
  75. ObtenerMillares(miles), ObtenerCentenas(resto))
  76. End If
  77. End Function
  78.  
  79. Private Function ObtenerMillares(ByVal cantidad As Integer) As String
  80. If cantidad = 1 Then
  81. Return "mille"
  82. Else
  83. Return String.Format("{0} milia",
  84. ObtenerCentenas(cantidad))
  85. End If
  86. End Function
  87.  
  88. '0..999
  89. Protected Function ObtenerCentenas(ByVal numero As Integer) As String
  90. Dim centenas As Integer = numero \ 100
  91. Dim resto As Integer = numero Mod 100
  92. If centenas = 0 Then
  93. Return ObtenerDecenas(resto)
  94. ElseIf resto = 0 Then
  95. Return _centenas(centenas)
  96. Else
  97. Return String.Format("{0} {1}",
  98. _centenas(centenas), ObtenerDecenas(resto))
  99. End If
  100. End Function
  101.  
  102. '0..99
  103. Protected Function ObtenerDecenas(ByVal numero As Integer) As String
  104. If numero >= 0 And numero <= 19 Then
  105. Return _unidades(numero)
  106. Else
  107. Dim decenas As Integer = numero \ 10
  108. Dim resto As Integer = numero Mod 10
  109. If resto = 0 Then
  110. Return _decenas(decenas)
  111. ElseIf resto = 8 And decenas <> 9 Then '98 es una excepción
  112. Return String.Format("duode{0}",
  113. ObtenerSiguienteDecena(decenas))
  114. ElseIf resto = 9 Then
  115. Return String.Format("unde{0}",
  116. ObtenerSiguienteDecena(decenas))
  117. Else
  118. Return String.Format("{0} {1}",
  119. _decenas(decenas), ArrayUnidades(resto))
  120. End If
  121. End If
  122. End Function
  123.  
  124. Protected Function ObtenerSiguienteDecena(ByVal decena As Integer) As String
  125. If decena <= 8 Then
  126. Return _decenas(decena + 1)
  127. Else
  128. Return "centum"
  129. End If
  130. End Function
  131.  
  132. '0..19
  133. Private Shared _unidades = {"nulla", "unus", "duo", "tres", "quattuor",
  134. "quinque", "sex", "septem", "octo", "novem",
  135. "decem", "undecim", "duodecim", "tredecim", "quattuordecim",
  136. "quindecim", "sedecim", "septendecim", "duodeviginti", "undeviginti"}
  137.  
  138. '0, 10..90
  139. Private Shared _decenas = {
  140. "", "decem", "viginti", "triginta", "quadraginta",
  141. "quinquaginta", "sexaginta", "septuaginta", "octoginta", "nonaginta"}
  142.  
  143. '0, 100..900
  144. Private Shared _centenas = {
  145. "", "centum", "ducenti", "trecenti", "quadringenti",
  146. "quingenti", "sescenti", "septingenti", "octingenti", "nongenti"}
  147.  
  148. Public Overridable Function ArrayUnidades(ByVal numero As Integer) As String
  149. Return _unidades(numero)
  150. End Function
  151.  
  152. End Class
  153.  
  154. '================================================
  155. ' NUMERACIÓN LATIN NEUTRO
  156.  
  157. Public Class NumeracionLatinNeutro
  158. Inherits NumeracionLatinMasculino
  159.  
  160. Public Overrides Function ArrayUnidades(ByVal numero As Integer) As String
  161. Select Case numero
  162. Case 1 : Return "unum"
  163. Case 2 : Return "duo"
  164. Case 3 : Return "tria"
  165. Case Else : Return MyBase.ArrayUnidades(numero)
  166. End Select
  167. End Function
  168.  
  169. End Class
  170.  
  171. '================================================
  172. ' NUMERACIÓN LATIN FEMENINO
  173.  
  174. Public Class NumeracionLatinFemenino
  175. Inherits NumeracionLatinMasculino
  176.  
  177. Public Overrides Function ArrayUnidades(ByVal numero As Integer) As String
  178. Select Case numero
  179. Case 1 : Return "una"
  180. Case 2 : Return "duae"
  181. Case 3 : Return "tres"
  182. Case Else : Return MyBase.ArrayUnidades(numero)
  183. End Select
  184. End Function
  185.  
  186. End Class

Proinf.net