Serie ficheros virtuales



VBA. Ficheros virtuales



VBA. Conversiones de longitud fija


1 Introducción
2 Conversiones Long
3 Conversiones Double
4 Artificio complementario para las conversiones double utilizadas como clave
5 Fuentes


                                                                                                   _______

 
                                                           

1 Introducción

En VBA Ficheros virtuales se utilizarán variables String como soporte auxiliar para la emulación de estructuras de claves y datos en la construcción de ficheros virtuales.

Para llevar a cabo este propósito se precisan funciones de conversión de números a Strings de longitud fija, de forma que luego puedan compararse homogéneamente mediante la función U_BS presentada en el capítulo anterior.

La siguiente hoja muestra una colección de ejemplos:



El núcleo de estas funciones lo compone la instrucción Format, de la misma forma que en el lenguaje C el núcleo lo proporcionaba la función sprintf.

Esta función núcleo la vamos a usar con máscaras de edición de longitud fija, utilizando las versiones:

            Format(NúmeroLong, "0000000000")  para números enteros y

            Format(NumeroDouble, "0.00000000000000E+000") para números con decimales.


Con esta base, la codificación de LongToString y DoubleToString se expone a continuación

                                                                                                   _______

 

2 Conversiones Long

' Conversión auxiliar de números long a cadenas de formato fijo (Versión para claves, entradas siempre positivas)

Function Long2String(Lon As Long) As String

 Dim Strin As String * 10
 
 
 ' Formato para números grandes +
 
 If Lon >= 1000000000 Then
    Strin = Format(Lon, "0000000000")
    Long2String = Strin
    Exit Function
 End If
 
 
 ' Formato base, que complementa a una longitud fija de salida de 10
 
 Strin = Format(Lon, "000000000")
 Strin = "0" + Strin
 
 Long2String = Strin
 
End Function


' (La conversión inversa la proporciona directamente CLng)

                                                                                                   _______



Ahora una versión con soporte de números negativos

' Conversión auxiliar de números long a cadenas de formato fijo

Function LongToString(Lon As Long) As String

 Dim Strin As String * 10


 ' Formato para números grandes +
 
 If Lon >= 1000000000 Then
    Strin = Format(Lon, "0000000000")
    LongToString = Strin
    Exit Function
 End If
 
 
 ' Límite para números grandes negativos
 
 If Lon <= -1000000000 Then
    Strin = "-999999999"
    LongToString = Strin
    Exit Function
 End If
  
  
 ' Formato base, de longitud fija 10
 
 Strin = Format(Lon, "000000000")
 If Lon > 0 Then
    Strin = "0" + Strin
 End If
  
 LongToString = Strin
  
End Function


                                                                                                   _______

 

3 Conversiones Double


' Conversión auxiliar de números double a cadenas de formato fijo

Function DoubleToString(Doub As Double) As String

 Dim Strin As String * 22

 
 Strin = Format(Doub, "0.00000000000000E+000")
 If Doub > 0 Then
    Strin = "0" + Strin
 End If
 
 DoubleToString = Strin
 
End Function



' (La conversión inversa la proporciona directamente CDbl)


                                                                                                   _______




4 Artificio complementario para las conversiones double utilizadas como clave

Para utilizar DoubleToString como clave se precisa una constante de normalización de forma que el conjunto {Números + KTE} sea comparable lexicograficamente.


Entonces se grabarán los datos utilizando el artificio  d + KTE


 Const KTE as Double = 1000 ' Constante de normalización

 Dim sd As String  ' Wk. d como alfa
 Dim d As Double   ' Número double
 Dim Er As Integer ' Control de resultados intermedios


 sd = doubleTostring(d + KTE)
 
 lResul = W_Write("A", sd)



y se leerán deshaciendo el artificio restando la constante agregada antes



 Er = W_Read("A", 1, sd)  ' Lee el primer número double en secuencia
    
 d = CDbl(sd) - KTE       ' Deshace artificio para tomar el double original buscado

                                                                                                   _______




5 Fuentes

 

En el enlace siguiente se puede acceder al código fuente completo del módulo. Por su parte, puede utilizarse el enlace que sigue para acceder al libro W que recoge los ejemplos asociados a los primeros capítulos del blog. La hoja A del libro W corresponde al capítulo en curso.



                                                                                                  
_______