NumeracionEsperanto.vb

  1. ' NumeracionEsperanto.vb — ProInf.net — 29-feb-2012
  2. '
  3. ' Enlaces:
  4. ' es.wikibooks.org/wiki/Esperanto/Gramática/Números
  5. ' www.languagesandnumbers.com/como-contar-en-esperanto/es/epo/
  6. ' mylanguages.org/es/esperanto_numeros.php
  7. '
  8. ' El esperanto es una lengua auxiliar internacional inventada por Ludwik Łazarz Zamenhof en 1887.
  9. ' Tiene por lo menos 100 000 hablantes muy activos, cerca de 2 millones de hablantes regulares
  10. ' y mil hablantes nativos.
  11. ' Basado principalmente en un conjunto de idiomas europeos (alemán, francés, polaco y ruso),
  12. ' está escrito en una versión modificada del alfabeto latino y es muy regular en su formación.
  13. '
  14.  
  15. Public Class NumeracionEsperanto
  16.  
  17. ' Ejemplos:
  18. ' 10 = dek
  19. ' 20 = dudek
  20. ' 13 = dek tri
  21. ' 20 = dudek
  22. ' 25 = dukek kvin
  23. ' 30 = tridek
  24. ' 46 = kvardek ses
  25. ' 100 = cent
  26. ' 137 = cent tridek sep
  27. ' 200 = ducent
  28. ' 567 = kvincent sesdek sep
  29. ' 1.000 = mil
  30. ' 2.000 = dumil
  31. ' 9.999.999 = naŭ miliono naŭcent naŭdek naŭmil naŭcent naŭdek naŭ
  32.  
  33. Public Shared Function Obtener(ByVal numero As Decimal) As String
  34. If numero = 0 Then Return unidades(0)
  35. Dim escalas() As String = DescomponerEnEscalas(numero)
  36. Dim resultado As String = Join(escalas, " ")
  37. Return resultado
  38. End Function
  39.  
  40. Private Shared Function DescomponerEnEscalas(ByVal numero As Decimal) As String()
  41. Dim resultado As New List(Of String)
  42. For escala = 0 To escalas.Length - 1
  43. Dim valor As Integer = numero Mod 1000
  44. If valor > 0 Then
  45. resultado.Insert(0, ObtenerEscala(valor, escala))
  46. End If
  47. numero \= 1000
  48. If numero = 0 Then Exit For
  49. Next
  50. Return resultado.ToArray()
  51. End Function
  52.  
  53. Private Shared Function ObtenerEscala(
  54. ByVal valor As Integer,
  55. ByVal escala As Integer
  56. ) As String
  57. If valor = 1 And escala >= 1 Then
  58. Return escalas(escala)
  59. Else
  60. Dim escalar = Join(DescomponerEnPotencias(valor), " ")
  61. Return String.Format("{0} {1}", escalar, escalas(escala))
  62. End If
  63. End Function
  64.  
  65. Private Shared Function DescomponerEnPotencias(
  66. ByVal numero As Integer
  67. ) As String()
  68. Dim resultado As New List(Of String)
  69. For potencia = 0 To potencias.Length - 1
  70. Dim unidad As Integer = numero Mod 10
  71. If unidad > 0 Then
  72. resultado.Insert(0, ObtenerValor(unidad, potencia))
  73. End If
  74. numero \= 10
  75. If numero = 0 Then Exit For
  76. Next
  77. Return resultado.ToArray()
  78. End Function
  79.  
  80. Private Shared Function ObtenerValor(
  81. ByVal unidad As Integer,
  82. ByVal potencia As Integer
  83. ) As String
  84. If unidad = 1 And potencia >= 1 Then
  85. Return potencias(potencia)
  86. Else
  87. Return String.Format("{0}{1}", unidades(unidad), potencias(potencia))
  88. End If
  89. End Function
  90.  
  91. ' 0..9
  92. Protected Shared unidades = {
  93. "nul", "unu", "du", "tri", "kvar", "kvin", "ses", "sep", "ok", "naŭ"}
  94.  
  95. ' 1, 10, 100, 1000
  96. Protected Shared potencias = {"", "dek", "cent", "mil"}
  97.  
  98. ' Escala corta: 1, 10^3, 10^6, 10^9, 10^12, 10^15 .. 10^33
  99. ' eo.wikipedia.org/wiki/Vortoj_por_grandegaj_nombroj
  100. '
  101. Protected Shared escalas = {"", "mil",
  102. "miliono", "miliardo",
  103. "duiliono", "duiliardo",
  104. "triiliono", "triiliardo",
  105. "kvariliono", "kvariliardo",
  106. "kviniliono", "kviniliardo"}
  107.  
  108. End Class
  109.  
  110.  

Proinf.net