NumeracionOrdinal.vb

  1. ' NumeracionOrdinal.vb — ProInf.net — 4-mar-2012
  2. '
  3. ' http://es.wikipedia.org/wiki/Número_ordinal
  4. '
  5. 'En número ordinal es un número que denota la posición de un elemento
  6. ' perteneciente a una sucesión ordenada
  7.  
  8. '================================================
  9. ' NUMERACIÓN ORDINAL
  10.  
  11. Public Class NumeracionOrdinal
  12.  
  13. Private Shared _enNeutro As NumeracionOrdinalEnNeutro = Nothing
  14. Private Shared _enMasculino As NumeracionOrdinalEnMasculino = Nothing
  15. Private Shared _enFemenino As NumeracionOrdinalEnFemenino = Nothing
  16.  
  17. Private Shared _palabra As String = ""
  18. Private Shared _femenina As Boolean
  19.  
  20. Public Shared Sub Apalabrar(ByVal palabra As String, ByVal esFemenina As Boolean)
  21. _palabra = palabra
  22. _femenina = esFemenina
  23. End Sub
  24.  
  25. Public Shared Function Obtener(ByVal numero As Decimal) As String
  26. If _palabra = "" Then
  27. Return ObtenerEnMasculino(numero)
  28. Else
  29. Dim ordinal As String
  30. If _femenina Then
  31. ordinal = ObtenerEnFemenino(numero)
  32. Else
  33. ordinal = ObtenerEnNeutro(numero)
  34. End If
  35. Return String.Format("{0} {1}", ordinal, _palabra)
  36. End If
  37. End Function
  38.  
  39. Public Shared Function ObtenerEnNeutro(ByVal numero As Decimal) As String
  40. If _enNeutro Is Nothing Then _enNeutro = New NumeracionOrdinalEnNeutro()
  41. Return _enNeutro.Obtener(numero)
  42. End Function
  43.  
  44. Public Shared Function ObtenerEnMasculino(ByVal numero As Decimal) As String
  45. If _enMasculino Is Nothing Then _enMasculino = New NumeracionOrdinalEnMasculino()
  46. Return _enMasculino.Obtener(numero)
  47. End Function
  48.  
  49. Public Shared Function ObtenerEnFemenino(ByVal numero As Decimal) As String
  50. If _enFemenino Is Nothing Then _enFemenino = New NumeracionOrdinalEnFemenino()
  51. Return _enFemenino.Obtener(numero)
  52. End Function
  53.  
  54. End Class
  55.  
  56. '================================================
  57. ' NUMERACIÓN ORDINAL EN NEUTRO
  58.  
  59. Public Class NumeracionOrdinalEnNeutro
  60.  
  61. 'Ejemplos:
  62. ' 123 = tricentésimo vigésimo tercero
  63. ' 1.111 = milésimo, centésimo undécimo
  64. ' 2.050 = segundo milésimo, quincuagésimo
  65. ' 17.290 = decimoséptimo milésimo, ducentésimo nonagésimo
  66. ' 3.010.200.045 = tercer milésimo, décimo millonésimo; ducentésimo milésimo, cuadragésimo quinto
  67. ' 12 veces 9 = noningentésimo nonagésimo noveno milésimo,
  68. ' noningentésimo nonagésimo noveno millonésimo;
  69. ' noningentésimo nonagésimo noveno milésimo,
  70. ' noningentésimo nonagésimo noveno.
  71.  
  72. Public Function Obtener(ByVal numero As Decimal) As String
  73. Return ObtenerMillones(numero)
  74. End Function
  75.  
  76. 'Entre 1 y 999.999.999.999
  77. Private Function ObtenerMillones(ByVal numero As Decimal) As String
  78. If numero >= 1 And numero <= 999999999999 Then
  79. Dim cociente As Decimal = numero \ 1000000
  80. Dim resto As Decimal = numero Mod 1000000
  81. If cociente = 0 Then
  82. Return ObtenerMiles(resto)
  83. ElseIf resto = 0 Then
  84. Return ObtenerMillonesimos(cociente)
  85. Else
  86. Return String.Format("{0} {1}",
  87. ObtenerMillonesimos(cociente), ObtenerMiles(resto))
  88. End If
  89. Else
  90. Return ""
  91. End If
  92. End Function
  93.  
  94. Private Function ObtenerMillonesimos(ByVal cantidad As Integer) As String
  95. If cantidad = 1 Then
  96. Return ArrayPotencias(2)
  97. Else
  98. Return String.Format("{0} {1}",
  99. ObtenerMiles(cantidad, neutral:=True), ArrayPotencias(2))
  100. End If
  101. End Function
  102.  
  103. 'Entre 1 y 999.999
  104. Private Function ObtenerMiles(ByVal numero As Integer,
  105. Optional ByVal neutral As Boolean = False
  106. ) As String
  107. If numero >= 1 And numero <= 999999 Then
  108. Dim cociente As Integer = numero \ 1000
  109. Dim resto As Integer = numero Mod 1000
  110. If cociente = 0 Then
  111. Return ObtenerCentenas(resto, neutral)
  112. ElseIf resto = 0 Then
  113. Return ObtenerMilesimos(cociente)
  114. Else
  115. Return String.Format("{0} {1}",
  116. ObtenerMilesimos(cociente), ObtenerCentenas(resto, neutral))
  117. End If
  118. Else
  119. Return ""
  120. End If
  121. End Function
  122.  
  123. Private Function ObtenerMilesimos(ByVal cantidad As Integer) As String
  124. If cantidad = 1 Then
  125. Return ArrayPotencias(1)
  126. Else
  127. Return String.Format("{0} {1}",
  128. ObtenerCentenas(cantidad, neutral:=True), ArrayPotencias(1))
  129. End If
  130. End Function
  131.  
  132. 'Entre 1 y 999
  133. Private Function ObtenerCentenas(ByVal numero As Integer, ByVal neutral As Boolean) As String
  134. If numero >= 1 And numero <= 999 Then
  135. Dim cociente As Integer = numero \ 100
  136. Dim resto As Integer = numero Mod 100
  137. If cociente = 0 Then
  138. Return ObtenerDecenas(resto, neutral)
  139. ElseIf resto = 0 Then
  140. Return ArrayCentenas(cociente)
  141. Else
  142. Return String.Format("{0} {1}",
  143. ArrayCentenas(cociente), ObtenerDecenas(resto, neutral))
  144. End If
  145. Else
  146. Return ""
  147. End If
  148. End Function
  149.  
  150. 'Entre 1 y 99
  151. Private Function ObtenerDecenas(ByVal numero As Integer, ByVal neutral As Boolean) As String
  152. If numero >= 1 And numero <= 19 Then
  153. Return ObtenerUnidades(numero, neutral)
  154. ElseIf numero <= 99 Then
  155. Dim cociente = numero \ 10
  156. Dim resto = numero Mod 10
  157. If resto = 0 Then
  158. Return ArrayDecenas(cociente)
  159. Else
  160. Return String.Format("{0} {1}",
  161. ArrayDecenas(cociente), ObtenerUnidades(resto, neutral))
  162. End If
  163. Else
  164. Return ""
  165. End If
  166. End Function
  167.  
  168. 'Entre 1 y 19
  169. Protected Overridable Function ObtenerUnidades(ByVal numero As Integer, ByVal neutral As Boolean)
  170. If neutral Then
  171. Return unidades(numero)
  172. Else
  173. Return ArrayUnidades(numero)
  174. End If
  175. End Function
  176.  
  177. '--------------------------------------------
  178. ' IMPLEMENTACIÓN
  179.  
  180. Private Shared unidades As String() = {"", "primer", "segundo", "tercer", "cuarto",
  181. "quinto", "sexto", "séptimo", "octavo", "noveno",
  182. "décimo", "undécimo", "duodécimo", "decimotercer", "decimocuarto",
  183. "decimoquinto", "decimosexto", "decimoséptimo", "decimoctavo", "decimonoveno"}
  184.  
  185. Private Shared decenas As String() = {"", "décimo", "vigésimo", "trigésimo", "cuadragésimo",
  186. "quincuagésimo", "sexagésimo", "septuagésimo", "octogésimo", "nonagésimo"}
  187.  
  188. Private Shared centenas As String() = {"", "centésimo", "ducentésimo", "tricentésimo", "cuadringentésimo",
  189. "quingentésimo", "sexcentésimo", "septingentésimo", "octingentésimo", "noningentésimo"}
  190.  
  191. Private Shared potencias As String() = {"", "milésimo", "millonésimo"}
  192.  
  193. Protected Overridable Function ArrayUnidades(ByVal numero As Integer) As String
  194. If numero >= 0 And numero < unidades.Length Then
  195. Return unidades(numero)
  196. Else
  197. Return ""
  198. End If
  199. End Function
  200.  
  201. Protected Overridable Function ArrayDecenas(ByVal numero As Integer) As String
  202. If numero >= 0 And numero < decenas.Length Then
  203. Return decenas(numero)
  204. Else
  205. Return ""
  206. End If
  207. End Function
  208.  
  209. Protected Overridable Function ArrayCentenas(ByVal numero As Integer) As String
  210. If numero >= 0 And numero < centenas.Length Then
  211. Return centenas(numero)
  212. Else
  213. Return ""
  214. End If
  215. End Function
  216.  
  217. Protected Overridable Function ArrayPotencias(ByVal numero As Integer) As String
  218. If numero >= 0 And numero < potencias.Length Then
  219. Return potencias(numero)
  220. Else
  221. Return ""
  222. End If
  223. End Function
  224.  
  225. End Class
  226.  
  227. '================================================
  228. ' NUMERACIÓN ORDINAL EN MASCULINO
  229.  
  230. Public Class NumeracionOrdinalEnMasculino
  231. Inherits NumeracionOrdinalEnNeutro
  232.  
  233. Protected Overrides Function ArrayUnidades(ByVal numero As Integer) As String
  234. Select Case numero
  235. Case 1 : Return "primero"
  236. Case 3 : Return "tercero"
  237. Case 13 : Return "decimotercero"
  238. Case Else : Return MyBase.ArrayUnidades(numero)
  239. End Select
  240. End Function
  241.  
  242. End Class
  243.  
  244. '================================================
  245. ' NUMERACIÓN ORDINAL EN FEMENINO
  246.  
  247. Public Class NumeracionOrdinalEnFemenino
  248. Inherits NumeracionOrdinalEnMasculino
  249.  
  250. Protected Overrides Function ObtenerUnidades(ByVal numero As Integer, ByVal neutral As Boolean)
  251. Return ArrayUnidades(numero)
  252. End Function
  253.  
  254. Protected Overrides Function ArrayUnidades(ByVal numero As Integer) As String
  255. Return EnFemenino(MyBase.ArrayUnidades(numero))
  256. End Function
  257.  
  258. Protected Overrides Function ArrayDecenas(ByVal numero As Integer) As String
  259. Return EnFemenino(MyBase.ArrayDecenas(numero))
  260. End Function
  261.  
  262. Protected Overrides Function ArrayCentenas(ByVal numero As Integer) As String
  263. Return EnFemenino(MyBase.ArrayCentenas(numero))
  264. End Function
  265.  
  266. Protected Overrides Function ArrayPotencias(ByVal numero As Integer) As String
  267. Return EnFemenino(MyBase.ArrayPotencias(numero))
  268. End Function
  269.  
  270. Private Shared Function EnFemenino(ByVal texto As String) As String
  271. If texto = "" Then Return ""
  272. Return texto.Substring(0, texto.Length - 1) & "a"
  273. End Function
  274.  
  275. End Class

Proinf.net