NumeracionInterlingua.vb

  1. ' NumeracionInterlingua.vb — ProInf.net — 29-feb-2012
  2. '
  3. ' Enlaces:
  4. ' www.languagesandnumbers.com/como-contar-en-interlingua/es/ina/
  5. '
  6. ' La interlingua es una lengua auxiliar internacional desarrollada entre 1937 y 1951 por
  7. ' la International Auxiliary Language Association (IALA),
  8. ' cuyo objetivo fue determinar cual lengua auxiliar era la más adecuada para la comunicación internacional,
  9. ' pero acabó desarrollando un lenguaje propio con la ayuda de Alexander Gode.
  10. ' Es una lengua auxiliar naturalista, o una lengua a posteriori,
  11. ' porque basada en lenguajes naturales (es decir alemán, español, francés, inglés, italiano, latín,
  12. ' portugués y ruso).
  13.  
  14. Public Class NumeracionInterlingua
  15.  
  16. ' Ejemplos:
  17. ' 12 = dece-duo
  18. ' 25 = vinti-cinque
  19. ' 79 = septanta-nove
  20. ' 100 = cento
  21. ' 137 = cento tresanta-septe
  22. ' 200 = duo centos
  23. ' 596 = cinque centos novanta-sex
  24. ' 1000 = mille
  25. ' 5000 = cinque milles
  26. ' 11.111 = dece-un milles cento dece-un
  27. ' 1.000.000 = un million
  28. ' 9.999.999 = nove milliones nove centos novanta-nove milles nove centos novanta-nove
  29.  
  30. Public Shared Function Obtener(ByVal numero As Decimal) As String
  31. If numero = 0 Then Return unidades(0)
  32. Dim escalas() As String = DescomponerEnEscalas(numero)
  33. Dim resultado As String = Join(escalas, " ")
  34. Return resultado
  35. End Function
  36.  
  37. Private Shared Function DescomponerEnEscalas(ByVal numero As Decimal) As String()
  38. Dim resultado As New List(Of String)
  39. For escala = 0 To escalas.Length - 1
  40. Dim valor As Integer = numero Mod 1000
  41. If valor > 0 Then
  42. resultado.Insert(0, ObtenerEscala(valor, escala))
  43. End If
  44. numero \= 1000
  45. If numero = 0 Then Exit For
  46. Next
  47. Return resultado.ToArray()
  48. End Function
  49.  
  50. Private Shared Function ObtenerEscala(
  51. ByVal valor As Integer,
  52. ByVal escala As Integer
  53. ) As String
  54. If escala = 0 Then
  55. Return ObtenerCentenas(valor)
  56. Else
  57. If valor = 1 Then
  58. If escala = 1 Then
  59. Return escalas(escala)
  60. Else
  61. Return String.Format("{0} {1}",
  62. unidades(valor), escalas(escala))
  63. End If
  64. Else
  65. Return String.Format("{0} {1}",
  66. ObtenerCentenas(valor), EnPlural(escalas(escala)))
  67. End If
  68. End If
  69. End Function
  70.  
  71. '0..999
  72. Private Shared Function ObtenerCentenas(ByVal valor As Integer) As String
  73. Dim cociente = valor \ 100
  74. Dim resto = valor Mod 100
  75. If cociente = 0 Then
  76. Return ObtenerDecenas(resto)
  77. ElseIf resto = 0 Then
  78. Return ExtraerCentenas(cociente, potencias(2))
  79. Else
  80. Return String.Format("{0} {1}",
  81. ExtraerCentenas(cociente, potencias(2)),
  82. ObtenerDecenas(resto))
  83. End If
  84. End Function
  85.  
  86. Private Shared Function ExtraerCentenas(
  87. ByVal valor As Integer, ByVal sufijo As String
  88. ) As String
  89. If valor = 1 Then
  90. Return sufijo
  91. Else
  92. Return String.Format("{0} {1}", unidades(valor), EnPlural(sufijo))
  93. End If
  94. End Function
  95.  
  96. '0..99
  97. Private Shared Function ObtenerDecenas(ByVal valor As Integer) As String
  98. Dim cociente = valor \ 10
  99. Dim resto = valor Mod 10
  100. If cociente = 0 Then
  101. Return unidades(resto)
  102. ElseIf resto = 0 Then
  103. Return decenas(cociente)
  104. Else
  105. Return String.Format("{0}-{1}", decenas(cociente), unidades(resto))
  106. End If
  107. End Function
  108.  
  109. Protected Shared Function EnPlural(ByVal texto As String) As String
  110. If AcabaEnVocal(texto) Then
  111. Return texto & "s"
  112. Else
  113. Return texto & "es"
  114. End If
  115. End Function
  116.  
  117. Protected Shared Function AcabaEnVocal(ByVal texto As String) As String
  118. Return "aeiou".Contains(texto(texto.Length - 1))
  119. End Function
  120.  
  121. '0..9
  122. Private Shared unidades = {
  123. "zero", "un", "duo", "tres", "quatro", "cinque", "sex", "septe", "octo", "nove"}
  124.  
  125. '0, 10..90
  126. Private Shared decenas = {"", "dece", "vinti", "tresanta", "quaranta", "cinquanta",
  127. "sexanta", "septanta", "octanta", "novanta"}
  128.  
  129. '1 10 100 1000
  130. Private Shared potencias = {"", "dece", "cento", "mille"}
  131.  
  132. 'Escala corta: 1 10^3 10^6 10^9 10^12 10^15 10^18 10^21
  133. Private Shared escalas = {"", "mille",
  134. "million", "milliardo",
  135. "billion", "billiardo",
  136. "trillion", "trilliardo"}
  137.  
  138. End Class
  139.  
  140.  
  141.  

Proinf.net