Numeral.vb

  1. ' Alfabeto.vb — ProInf.net — feb-2012
  2. '
  3. ' Clases para generar secuencias de números, letras, etc.
  4. '
  5. '
  6. ' Posible ampliación:
  7. ' - El sistema numérico Nahuatl - www.elsurcodelsembrador.com/ximopanolti/content/view/37/51/
  8.  
  9. '================================================
  10. ' NUMERALES
  11. '¡Esta enumeración se ha de sincronizar con DiccionarioNumerales!
  12.  
  13. Public Enum Numerales
  14. Alfabético ' A B C D E ... Z AA AB ...
  15. Alfabético_Español ' a be ce de e ...
  16. Alfabético_Griego ' Alfa Beta Gamma Delta Épsilon ...
  17. Alfabético_Musical 'do re mi fa sol la si dodo dore ...
  18. Alfabético_Radiofónico ' Alfa Bravo Charlie Delta Echo
  19. Cardinal_Alfaromano ' i a ai e ei ..
  20. Cardinal_Español ' uno dos tres cuatro cinco ...
  21. Cardinal_Esperanto ' unu du tri kvar kvin ...
  22. Cardinal_Interlingua 'un duo tres quatro cinque ...
  23. Cardinal_Klingon ' wa' cha' wej loS vagh ...
  24. Cardinal_Japonés ' ichi ni san yen go ...
  25. Cardinal_Latín ' unus duo tres quattuor quinque ...
  26. Cardinal_Lojban 'pa re ci vo mu ...
  27. Cardinal_Sona ' enna do tin ca pen ...
  28. Medición_Internacional '(con byte) un byte ... 2 kilobytes y tres bytes ...
  29. Medición_Temporal 'un día, dos días, ..., tres años y un día ...
  30. Numeración_Arábiga ' 1 2 3 4 5 ...
  31. Numeración_Hexadecimal ' 1 2 3 4 5 6 7 8 9 A B C ...
  32. Numeración_Romana ' I II III IV V ...
  33. Ordinal_Español ' primero segundo tercero cuarto quinto ...
  34. End Enum
  35.  
  36. Public Interface INumeral
  37. Function Secuenciar(ByVal numero As Decimal) As String
  38. Function Separador() As String
  39. 'Function Ejemplo() As String
  40. End Interface
  41.  
  42. Public MustInherit Class NumeralAbstracto
  43. Implements INumeral
  44.  
  45. Public MustOverride Function Secuenciar(ByVal numero As Decimal) As String _
  46. Implements INumeral.Secuenciar
  47.  
  48. Public Overridable Function Separador() As String _
  49. Implements INumeral.Separador
  50. Return ""
  51. End Function
  52.  
  53. Public Shared Sub Secuenciar(
  54. ByVal numero As Integer,
  55. ByVal total As Integer,
  56. ByVal accion As Action(Of Integer)
  57. )
  58. Dim cociente As Integer = numero - 1
  59. Do
  60. Dim modulo = cociente Mod total
  61. accion(modulo)
  62. cociente = cociente \ total - 1
  63. Loop Until cociente < 0
  64. End Sub
  65. End Class
  66.  
  67. Public MustInherit Class NumeralArray
  68. Inherits NumeralAbstracto
  69.  
  70. Protected MustOverride Function ObtenerArray() As String()
  71.  
  72. Public Overrides Function Separador() As String
  73. Return " "
  74. End Function
  75.  
  76. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  77. Dim lista As New List(Of String)
  78. Dim array = ObtenerArray()
  79. Secuenciar(numero, array.Length,
  80. Sub(modulo As Integer)
  81. If modulo >= 0 Then
  82. lista.Insert(0, array(modulo))
  83. End If
  84. End Sub)
  85. Return Join(lista.ToArray(), Separador())
  86. End Function
  87.  
  88. End Class
  89.  
  90. '================================================
  91. ' IMPLEMENTACIÓN DE LOS NUMERALES
  92.  
  93. Public Class NumeralAlfabetico 'Como las columnas de una hoja de cálculo
  94. Inherits NumeralAbstracto
  95.  
  96. Private Shared alfabetico As String = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"
  97.  
  98. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  99. Dim sb As New System.Text.StringBuilder()
  100. Secuenciar(numero, alfabetico.Length, Sub(modulo As Integer) sb.Insert(0, alfabetico(modulo)))
  101. Return sb.ToString()
  102. End Function
  103.  
  104. End Class
  105.  
  106. Public Class NumeralAlfabeticoEspañol
  107. Inherits NumeralArray
  108.  
  109. 'http://www.rae.es/
  110.  
  111. Public Property Plural As Boolean
  112.  
  113. Private Shared singulares = {
  114. "a", "be", "ce", "de", "e", "efe", "ge", "hache", "i", "jota", "ka",
  115. "ele", "eme", "ene", "eñe", "o", "pe", "cu", "erre", "ese", "te",
  116. "u", "uve", "uve doble", "equis", "ye", "zeta"
  117. }
  118. Private Shared plurales = {
  119. "aes", "bes", "ces", "des", "es", "efes", "ges", "haches", "íes", "jotas", "kas",
  120. "eles", "emes", "enes", "eñes", "oes", "pes", "cus", "erres", "eses", "tes",
  121. "úes", "uves", "uves dobles", "equis", "yes", "zetas"
  122. }
  123.  
  124. Public Sub New(Optional ByVal enPlural As Boolean = False)
  125. Plural = enPlural
  126. End Sub
  127.  
  128. Protected Overrides Function ObtenerArray() As String()
  129. If Plural Then Return plurales Else Return singulares
  130. End Function
  131.  
  132. End Class
  133.  
  134. Public Class NumeralAlfaromano 'Cardinal inventado
  135. Inherits NumeralAbstracto
  136.  
  137. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  138. Dim texto = NumeracionAlfaromana.Obtener(numero)
  139. Return Utilidades.Capitalizar(texto)
  140. End Function
  141.  
  142. End Class
  143.  
  144. Public Class NumeralArabigo 'Numérico
  145. Inherits NumeralAbstracto
  146.  
  147. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  148. Return numero.ToString()
  149. End Function
  150.  
  151. End Class
  152.  
  153. Public Class NumeralEspañol 'Cardinal en Español
  154. Inherits NumeralAbstracto
  155. Implements IApalabrado
  156.  
  157. Private apalabrado As New Apalabrado()
  158.  
  159. 'Nombres de los números en español
  160. 'http://es.wikipedia.org/wiki/Anexo:Nombres_de_los_números_en_español
  161.  
  162. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  163. Dim cardinal As String
  164. Dim palabra As String = apalabrado.Obtener(numero = 1)
  165. If apalabrado.EsFemenina() Then
  166. cardinal = CifrasEnLetras.convertirCifrasEnLetrasFemeninas(numero)
  167. ElseIf palabra <> "" Then
  168. cardinal = CifrasEnLetras.convertirCifrasEnLetras(numero)
  169. Else
  170. cardinal = CifrasEnLetras.convertirCifrasEnLetrasMasculinas(numero)
  171. End If
  172. Return Utilidades.Capitalizar(cardinal & palabra)
  173. End Function
  174.  
  175. Public Sub Apalabrar(ByVal palabra As String, ByVal esFemenina As Boolean
  176. ) Implements IApalabrado.Apalabrar
  177. apalabrado.Apalabrar(palabra, esFemenina)
  178. End Sub
  179.  
  180. End Class
  181.  
  182. Public Class NumeralEsperanto 'Cardinal en Esperanto
  183. Inherits NumeralAbstracto
  184.  
  185. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  186. Dim texto = NumeracionEsperanto.Obtener(numero)
  187. Return Utilidades.Capitalizar(texto)
  188. End Function
  189.  
  190. End Class
  191.  
  192. Public Class NumeralGriego 'Alfabético en Griego
  193. Inherits NumeralArray
  194.  
  195. Public Shared griego = {"Alfa", "Beta", "Gamma", "Delta", "Épsilon", "Dseta",
  196. "Eta", "Theta", "Iota", "Kappa", "Lambda", "Mi", "Ni", "Xi", "Ómicron", "Pi",
  197. "Rho", "Sigma", "Tau", "Ípsilon", "Fi", "Ji", "Psi", "Omega"}
  198.  
  199. Protected Overrides Function ObtenerArray() As String()
  200. Return griego
  201. End Function
  202.  
  203. End Class
  204.  
  205. Public Class NumeralHexadecimal 'Numeración en hexadecimal
  206. Inherits NumeralAbstracto
  207.  
  208. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  209. Return Hex(numero)
  210. End Function
  211.  
  212. End Class
  213.  
  214. Public Class NumeralInterlingua 'Cardinal en Interlingua
  215. Inherits NumeralAbstracto
  216.  
  217. 'http://www.languagesandnumbers.com/como-contar-en-interlingua/es/ina/
  218.  
  219. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  220. Dim texto = NumeracionInterlingua.Obtener(numero)
  221. Return Utilidades.Capitalizar(texto)
  222. End Function
  223.  
  224. End Class
  225.  
  226. Public Class NumeralInternacional 'Medición en el Sistema Internacional
  227. Inherits NumeralAbstracto
  228. Implements IApalabrado
  229.  
  230. Private _enLetras As Boolean
  231. Private _palabra As String
  232. Private _femenina As Boolean
  233.  
  234. Public Sub New(ByVal enLetras As Boolean)
  235. _enLetras = enLetras
  236. End Sub
  237.  
  238. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  239. Dim texto As String
  240. If _enLetras Then
  241. texto = NumeracionInternacional.ObtenerEnLetras(numero, _palabra, , _femenina)
  242. Else
  243. texto = NumeracionInternacional.ObtenerEnCifras(numero, _palabra)
  244. End If
  245. Return Utilidades.Capitalizar(texto)
  246. End Function
  247.  
  248. Public Sub Apalabrar(ByVal palabra As String, ByVal esFemenina As Boolean
  249. ) Implements IApalabrado.Apalabrar
  250. _palabra = palabra
  251. _femenina = esFemenina
  252. End Sub
  253.  
  254. End Class
  255.  
  256. Public Class NumeralKlingon 'Cardinal en Klingon (Star Trek)
  257. Inherits NumeralAbstracto
  258.  
  259. 'http://www.languagesandnumbers.com/como-contar-en-klingon/es/tlh/
  260.  
  261. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  262. Return NumeracionKlingon.Obtener(numero)
  263. End Function
  264.  
  265. End Class
  266.  
  267. Public Class NumeralJapones 'Cardinal en Japonés
  268. Inherits NumeralAbstracto
  269.  
  270. 'http://es.wikipedia.org/wiki/Numeración_japonesa
  271.  
  272. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  273. Dim texto = NumeracionJaponesa.Obtener(numero)
  274. Return Utilidades.Capitalizar(texto)
  275. End Function
  276.  
  277. End Class
  278.  
  279. Public Class NumeralMusical 'Alfabético de notas musicales
  280. Inherits NumeralArray
  281.  
  282. Public Shared notas = {"Do", "Re", "Mi", "Fa", "Sol", "La", "Si"}
  283.  
  284. Public Overrides Function Separador() As String
  285. Return " "
  286. End Function
  287.  
  288. Protected Overrides Function ObtenerArray() As String()
  289. Return notas
  290. End Function
  291.  
  292. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  293. Dim texto As String = MyBase.Secuenciar(numero)
  294. Return texto
  295. End Function
  296.  
  297. End Class
  298.  
  299. Public Class NumeralLatin 'Cardinal en Latín
  300. Inherits NumeralAbstracto
  301.  
  302. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  303. Dim texto = NumeracionLatin.ObtenerEnMasculino(numero)
  304. Return Utilidades.Capitalizar(texto)
  305. End Function
  306.  
  307. End Class
  308.  
  309. Public Class NumeralOrdinalEspañol 'Ordinal en Español
  310. Inherits NumeralAbstracto
  311. Implements IApalabrado
  312.  
  313. 'http://es.wikipedia.org/wiki/Número_ordinal
  314.  
  315. Public Overloads Overrides Function Secuenciar(ByVal numero As Decimal) As String
  316. Dim texto As String = NumeracionOrdinal.Obtener(numero)
  317. Return Utilidades.Capitalizar(texto)
  318. End Function
  319.  
  320. Public Sub Apalabrar(ByVal palabra As String, ByVal esFemenina As Boolean
  321. ) Implements IApalabrado.Apalabrar
  322. NumeracionOrdinal.Apalabrar(palabra, esFemenina)
  323. End Sub
  324.  
  325. End Class
  326.  
  327. Public Class NumeralRadiofonico 'Alfabético radiofónico
  328. Inherits NumeralArray
  329.  
  330. 'http://es.wikipedia.org/wiki/Alfabeto_por_palabras
  331. 'http://es.wikipedia.org/wiki/Alfabeto_radiofónico
  332.  
  333. Public Shared radiofonico = {"Alfa", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot",
  334. "Golf", "Hotel", "India", "Juliet", "Kilo", "Lima", "Mike", "November", "Oscar",
  335. "Papa", "Quebec", "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey",
  336. "X-ray", "Yankee", "Zulu"}
  337.  
  338. Protected Overrides Function ObtenerArray() As String()
  339. Return radiofonico
  340. End Function
  341.  
  342. End Class
  343.  
  344. Public Class NumeralRomano 'Numeración en Romano
  345. Inherits NumeralAbstracto
  346.  
  347. 'http://es.wikipedia.org/wiki/Numeración_romana
  348.  
  349. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  350. Return NumeracionRomana.Obtener(numero)
  351. End Function
  352.  
  353. End Class
  354.  
  355. Public Class NumeralTemporal 'Medición de tiempo transcurrido
  356. Inherits NumeralAbstracto
  357.  
  358. 'http://es.wikipedia.org/wiki/Sistemas_de_tiempo
  359.  
  360. Private _enLetras As Boolean
  361.  
  362. Public Sub New(ByVal enLetras As Boolean)
  363. _enLetras = enLetras
  364. End Sub
  365.  
  366. Public Overrides Function Secuenciar(ByVal numero As Decimal) As String
  367. Dim texto As String
  368. If _enLetras Then
  369. texto = NumeracionTemporal.ObtenerEnLetras(numero)
  370. Else
  371. texto = NumeracionTemporal.ObtenerEnCifras(numero)
  372. End If
  373. Return Utilidades.Capitalizar(texto)
  374. End Function
  375.  
  376. End Class
  377.  
  378. Public Class NumeralSona 'Cardinal en Sona
  379. Inherits NumeralAbstracto
  380.  
  381. Public Overloads Overrides Function Secuenciar(ByVal numero As Decimal) As String
  382. Return NumeracionSona.Obtener(numero)
  383. End Function
  384.  
  385. End Class
  386.  
  387. Public Class NumeralLojban 'Cardinal en Lojban
  388. Inherits NumeralAbstracto
  389.  
  390. ' http://es.wikipedia.org/wiki/Lojban
  391.  
  392. '0..9
  393. Private Shared digitos As String() = {
  394. "no", "pa", "re", "ci", "vo", "mu", "xa", "ze", "bi", "so"}
  395.  
  396. Public Overloads Overrides Function Secuenciar(ByVal numero As Decimal) As String
  397. Dim sb As New System.Text.StringBuilder()
  398. Do
  399. Dim digito = numero Mod 10
  400. numero \= 10
  401. sb.Insert(0, digitos(digito))
  402. Loop While numero > 0
  403. Return sb.ToString()
  404. End Function
  405.  
  406. End Class

Proinf.net