NumeracionInternacional.vb

  1. ' NumeracionInternacional.vb — ProInf.net — 1-mar-2012
  2. '
  3. ' http://es.wikipedia.org/wiki/Sistema_Internacional_de_Unidades
  4. ' http://es.wikipedia.org/wiki/Escalas_numéricas_larga_y_corta
  5. '
  6. ' Numeración del sistema internacional
  7. ' Usa la escala numérica corta
  8. '
  9. ' Ejemplos (con gramo):
  10. ' 1 = un gramo
  11. ' 10 = diez gramos (un decagramo)
  12. ' 16 = dieciséis gramos (un decagramo y seis gramos)
  13. ' 23 = veintitrés gramos (dos decagramos y seis gramos)
  14. ' 178 = ciento setenta y ocho gramos (un hectogramo, siete decagramos y ocho gramos)
  15. ' 1.009 = un kilogramo y nueve gramos
  16. ' 2.456.089.001 = dos gigagramos, cuatro mil cincuenta y seis megagramos, ochenta y nueve kilogramos y un gramo
  17. ' 5.000.870.000.000 = cinco teragramos y ochocientos setenta megagramos
  18.  
  19. '================================================
  20. ' NUMERACIÓN INTERNACIONAL
  21.  
  22. Public Class NumeracionInternacional
  23.  
  24. Private Shared _enCifras As NumeracionInternacionalEnCifras = Nothing
  25. Private Shared _enLetras As NumeracionInternacionalEnLetras = Nothing
  26.  
  27. Public Shared Function ObtenerEnCifras(
  28. ByVal numero As Decimal,
  29. ByVal unidad As String,
  30. Optional ByVal unidadEnPlural As String = ""
  31. ) As String
  32. If _enCifras Is Nothing Then _enCifras = New NumeracionInternacionalEnCifras()
  33. _enCifras.UnidadEnSingular = unidad
  34. _enCifras.UnidadEnPlural = unidadEnPlural
  35. Return _enCifras.Obtener(numero)
  36. End Function
  37.  
  38. Public Shared Function ObtenerEnLetras(
  39. ByVal numero As Decimal,
  40. ByVal unidad As String,
  41. Optional ByVal unidadEnPlural As String = "",
  42. Optional ByVal esFemenina As Boolean = False
  43. ) As String
  44. If _enLetras Is Nothing Then _enLetras = New NumeracionInternacionalEnLetras()
  45. _enLetras.UnidadEnSingular = unidad
  46. _enLetras.UnidadEnPlural = unidadEnPlural
  47. _enLetras.Femenina = esFemenina
  48. Return _enLetras.Obtener(numero)
  49. End Function
  50.  
  51. End Class
  52.  
  53. '================================================
  54. ' NUMERACIÓN INTERNACIONAL EN CIFRAS
  55.  
  56. Public Class NumeracionInternacionalEnCifras
  57.  
  58. Public Property UnidadEnSingular As String
  59. Public Property UnidadEnPlural As String
  60.  
  61. Public Overridable Function Obtener(ByVal numero As Decimal) As String
  62. PredeterminarUnidadEnPlural()
  63. If numero = 0 Then Return ObtenerValor(0, "")
  64. Dim resultados() As String = DescomponerEnEscalas(numero)
  65. Dim resultado As String = Join(resultados, ", ")
  66. Return InsertarConjuncion(resultado)
  67. End Function
  68.  
  69. Protected Overridable Sub PredeterminarUnidadEnPlural()
  70. If UnidadEnPlural = "" And UnidadEnSingular <> "" Then
  71. UnidadEnPlural = UnidadEnSingular & "s"
  72. End If
  73. End Sub
  74.  
  75. Protected Overridable Function InsertarConjuncion(ByVal texto As String) As String
  76. Dim posicion = texto.LastIndexOf(", ")
  77. If posicion > 0 Then
  78. texto = texto.Remove(posicion, 2).Insert(posicion, " y ")
  79. End If
  80. Return texto
  81. End Function
  82.  
  83. Private Function DescomponerEnEscalas(ByVal numero As Decimal) As String()
  84. Dim resultado As New List(Of String)
  85. For i = 0 To array_escalas.Length - 1
  86. Dim valor As Integer = numero Mod 1000
  87. Dim prefijo = array_escalas(i)
  88. If valor > 0 Then
  89. resultado.Insert(0, ObtenerValor(valor, prefijo))
  90. End If
  91. numero \= 1000
  92. If numero = 0 Then Exit For
  93. Next
  94. Return resultado.ToArray()
  95. End Function
  96.  
  97. Private Function ObtenerValor(
  98. ByVal valor As Integer,
  99. ByVal prefijo As String
  100. ) As String
  101. Dim cantidad = FormatearNumero(valor)
  102. Dim unidad = If(valor = 1, UnidadEnSingular, UnidadEnPlural)
  103. If unidad = "" Then unidad = "?"
  104. Return String.Format("{0} {1}{2}", cantidad, prefijo, unidad)
  105. End Function
  106.  
  107. Protected Overridable Function FormatearNumero(ByVal numero As Integer) As String
  108. Return numero.ToString("#,##0")
  109. End Function
  110.  
  111. '--------------------------------------------
  112. ' ARRAYS
  113.  
  114. 'Prefijos griegos entre 0 y 12
  115. Protected array_unidades As String() = {"", "mono", "bi", "tri", "tetra",
  116. "penta", "hexa", "hepta", "octa", "nona", "deca", "endeca", "duodeca"}
  117.  
  118. 'Potencias: 1, 10, 100, 1000
  119. Protected array_potencias As String() = {"", "deca", "hecto", "kilo"}
  120.  
  121. 'Escala corta: 1, 10^3, 10^6, 10^9, 10^12, 10^15, 10^18, 10^21, 10^24
  122. Protected array_escalas As String() = {"", "kilo", "mega", "giga", "tera",
  123. "peta", "exa", "zetta", "yotta"}
  124.  
  125. End Class
  126.  
  127. '================================================
  128. ' NUMERACIÓN INTERNACIONAL EN LETRAS
  129.  
  130. Public Class NumeracionInternacionalEnLetras
  131. Inherits NumeracionInternacionalEnCifras
  132.  
  133. Public Property Femenina As Boolean
  134.  
  135. Protected Overrides Function FormatearNumero(ByVal numero As Integer) As String
  136. If Femenina Then
  137. Return CifrasEnLetras.convertirCifrasEnLetrasFemeninas(numero)
  138. Else
  139. Return CifrasEnLetras.convertirCifrasEnLetras(numero)
  140. End If
  141. End Function
  142.  
  143. End Class
  144.  

Proinf.net