NumeracionSona.vb

  1. ' NumeracionSona.vb — ProInf.net — 29-feb-2012
  2. '
  3. ' Enlaces:
  4. ' http://es.wikipedia.org/wiki/Lengua_sona
  5. ' http://www.rickharrison.com/language/sona4.html
  6. ' http://www.languagesandnumbers.com/como-contar-en-sona/es/sona/
  7. '
  8. ' Searight incorporó en su proyecto elementos semánticos y estructurales de diversos idiomas,
  9. ' entre ellos el japonés, el inglés, el turco, el chino, el ruso, el persa y el árabe,
  10. ' así como de las lenguas neolatinas.
  11.  
  12. Public Class NumeracionSona
  13.  
  14. ' Ejemplos:
  15. ' 0 = naci
  16. ' 1 = enna
  17. ' 10 = dici
  18. ' 100 = son
  19. ' 442 = ca-son ca-y-edi-do
  20. ' 1000 = tan
  21. ' 1001 = tan-y-enna
  22. ' 1934 = tan nun-son tin-y-edi-ca
  23. ' 10.000 = dici-tan
  24. ' 100.000 = son-tan
  25. ' 1.000.000 = tan-ta
  26. ' 1.000.000.000 = do-tanta
  27.  
  28. Public Shared Function Obtener(ByVal numero As Decimal) As String
  29. If numero = 0 Then Return unidades(0)
  30. Dim escalas() As String = DescomponerEnEscalas(numero)
  31. Dim resultado As String = Join(escalas, " ")
  32. Return resultado
  33. End Function
  34.  
  35. Private Shared Function DescomponerEnEscalas(ByVal numero As Decimal) As String()
  36. Dim resultado As New List(Of String)
  37. For escala = 0 To escalas.Length - 1
  38. Dim valor As Integer = numero Mod 1000
  39. If valor > 0 Then
  40. resultado.Insert(0, ObtenerEscala(valor, escala))
  41. End If
  42. numero \= 1000
  43. If numero = 0 Then Exit For
  44. Next
  45. Return resultado.ToArray()
  46. End Function
  47.  
  48. Private Shared Function ObtenerEscala(
  49. ByVal valor As Integer,
  50. ByVal escala As Integer
  51. ) As String
  52. If escala = 0 Then
  53. Return ObtenerCentenas(valor)
  54. ElseIf valor = 1 Then
  55. Return escalas(escala)
  56. Else
  57. Return String.Format("{0}{1}",
  58. ObtenerCentenas(valor),
  59. escalas(escala))
  60. End If
  61. End Function
  62.  
  63. '0..999
  64. Private Shared Function ObtenerCentenas(ByVal valor As Integer) As String
  65. Dim cociente = valor \ 100
  66. Dim resto = valor Mod 100
  67. If cociente = 0 Then
  68. Return ObtenerDecenas(resto)
  69. ElseIf resto = 0 Then
  70. Return ExtraerCentena(cociente)
  71. Else
  72. Return String.Format("{0} {1}",
  73. ExtraerCentena(cociente),
  74. ObtenerDecenas(resto))
  75. End If
  76. End Function
  77.  
  78. Private Shared Function ExtraerCentena(ByVal digito As Integer) As String
  79. If digito = 1 Then
  80. Return "son"
  81. ElseIf digito <= 9 Then
  82. Return unidades(digito) & "son"
  83. Else
  84. Return ""
  85. End If
  86. End Function
  87.  
  88. '0..99
  89. Private Shared Function ObtenerDecenas(ByVal valor As Integer) As String
  90. Dim cociente = valor \ 10
  91. Dim resto = valor Mod 10
  92. If resto = 0 Then
  93. Return ExtraerDecena(cociente)
  94. ElseIf cociente = 0 Then
  95. Return unidades(resto)
  96. ElseIf cociente = 1 Then
  97. Return unidades(resto) & ExtraerDecena(cociente)
  98. Else
  99. Return ExtraerDecena(cociente) & unidades(resto)
  100. End If
  101. End Function
  102.  
  103. '10*1..10*9
  104. Private Shared Function ExtraerDecena(ByVal digito As Integer) As String
  105. If digito = 1 Then
  106. Return "dici"
  107. ElseIf digito <= 9 Then
  108. Return unidades(digito) & "yedi"
  109. Else
  110. Return ""
  111. End If
  112. End Function
  113.  
  114. ' Los guiones no se ponen
  115. '
  116. ' 0 = naci 10 = dici
  117. ' 1 = enna 11 = enna-dici 10 = dici 21 = doyedi-enna 100 = son
  118. ' 2 = do 12 = do-dici 20 = do-y-edi 22 = doyedi-do 200 = do-son
  119. ' 3 = tin 13 = tin-dici 30 = tin-y-edi 23 = doyedi-tin 300 = tin-son
  120. ' 4 = ca 14 = ca-dici 40 = can-y-edi 24 = doyedi-ca 400 = ca-son
  121. ' 5 = pen 15 = pen-dici 50 = pen-y-edi 25 = doyedi-pen 500 = pen-son
  122. ' 6 = xi 16 = xi-dici 60 = xi-y-edi 26 = doyedi-xi 600 = xi-son
  123. ' 7 = zun 17 = zun-dici 70 = zun-y-edi 27 = doyedi-zun 700 = zun-son
  124. ' 8 = atu 18 = atu-dici 80 = atu-y-edi 28 = doyedi-atu 800 = atu-son
  125. ' 9 = nun 19 = nun-dici 90 = nun-y-edi 29 = doyedi-nun 900 = nun-son
  126.  
  127. '0..9
  128. Private Shared unidades = {
  129. "naci", "enna", "do", "tin", "ca", "pen", "xi", "zun", "atu", "nun"}
  130.  
  131. '1 10 100 1000
  132. Private Shared potencias = {"", "dici", "son", "tan"}
  133.  
  134. 'Escala corta: 1 10^3 10^6 10^9
  135. Private Shared escalas = {"", "tan", "tanta", "dotanta"}
  136.  
  137. End Class
  138.  
  139.  
  140.  

Proinf.net