10 agosto 2007

Operaciones con cadenas de texto (IV)

Vamos a seguir con las funciones para tratamiento de cadenas de texto:

procedure Delete( var S: string; Index, Count:Integer );

Este procedimiento elimina de la cadena S (pasada por variable) un número de caracteres situados en la posición Index y cuya longitud viene determinada por Count. El primer elemento comienza por 1. Por ejemplo:

var
sTexto: String;
begin
sTexto := 'CORTANDO UNA CADENA DE TEXTO';
Delete( sTexto, 10, 14 );
end;

Ahora la variable sTexto contiene:

CORTANDO TEXTO

porque hemos eliminado UNA CADENA DE.

function DupeString( const AText: string; ACount: Integer ): string;

Esta función devuelve la cadena AText repetida tantas veces como se indique en ACount. Por ejemplo:

DupeString( 'HOLA ', 3 ) devuelve HOLA HOLA HOLA

function High( X );

Devuelve el valor más alto de un tipo de variable. Vamos a ver un ejemplo que utiliza esta función con distintos tipos de variable y muestra el resultado en un Memo:

var
Numeros: array[1..4] of Integer;
begin
Memo.Lines.Add( 'High( Char )=' + IntToStr( Ord( High( Char ) ) ) );
Memo.Lines.Add( 'High( Integer )=' + IntToStr( High( Integer ) ) );
Memo.Lines.Add( 'High( Word )=' + IntToStr( High( Word ) ) );
Memo.Lines.Add( 'High( DWord )=' + IntToStr( High( DWord ) ) );
Memo.Lines.Add( 'High( Boolean )=' + BoolToStr( High( Boolean ), True ) );
Numeros[1] := 13;
Numeros[2] := 6;
Numeros[3] := 16;
Numeros[4] := 5;
Memo.Lines.Add( 'High( Numeros )=' + IntToStr( High( Numeros ) ) );
end;

El resultado que muestra sería:

High( Char )=255
High( Integer )=2147483647
High( Word )=65535
High( DWord )=4294967295
High( Boolean )=True
High( Numeros )=4

Como vemos en el último caso, nos devuelve el último índice del del array Numeros.

procedure Insert( Source: string; var S: string; Index: Integer );

Este procedimiento inserta dentro de la cadena S (pasada como variable) la cadena Source en la posición Index. Por ejemplo:

var
sTexto: String;
begin
sTexto := 'AMPLIANDO TEXTO';
Insert( ' UNA CADENA DE', sTexto, 10 );
end;

Ahora sTexto contiene:

AMPLIANDO UNA CADENA DE TEXTO

function LastDelimiter( const Delimiters, S: string ): Integer;

Esta función nos devuelve la posición del último delimitador determinado por Delimiters que encuentre en la cadena S. Con unos ejemplos se ve mas claro:

LastDelimiter( ',', 'PABLO,JUAN,MARIA,MARCOS' ) devuelve 17
LastDelimiter( '.', '1.2.3.4.5' ) devuelve 8
LastDelimiter( '-:', 'A:1-B:2-C:3' ) devuelve 10

En el último ejemplo hemos utilizado dos delimitadores. Esta función sería muy interesante para crear un parser de código fuente HTML buscando delimitadores <>.

function Length( S ): Integer;

Devuelve la longitud máxima de una cadena de texto o de un array. Por ejemplo:

var
Valores: array of Integer;
begin
ShowMessage( Length( 'HOLA' ) );
SetLength( Valores, 3 );
ShowMessage( IntToStr( Length( Valores ) );
end;

Los comandos ShowMessage nos mostraría los valores 4 para la cadena HOLA y el valor 3, que es la longitud del array dinámico.

function LowerCase( const S: string ): string;

Convierte los caracteres de la cadena S a minúsculas. Se recomenda utilizar en su lugar la función AnsiLowerCase para caracteres internacionales de 8 bits. Por ejemplo:

LowerCase( 'Programando con Delphi' ) devuelve:

programando con delphi

LowerCase( 'MANIPULANDO CADA CARÁCTER DE LA CADENA' )

manipulando cada carÁcter de la cadena

Como vemos en este último ejemplo la palabra CARÁCTER ha dejado la Á en mayúsculas. Por ello se recomienda utilizar la función AnsiLowerCase para evitar estas incidencias.

procedure Move( const Source; var Dest; Count: Integer );

Este procedimiento (que debería llamarse quizás Copy) copia la cantidad de bytes Count de Source a la variable Dest. Por ejemplo:

var
sOrigen, sDestino: String;
begin
sOrigen := 'COPIANDO TEXTO';
sDestino := '--------------';
Move( sOrigen[10], sDestino[3], 5 );
end;

El valor de la variable destino sería:

--TEXTO-------

function Pos( Substr: string; S: string ): Integer;

Devuelve la posición de la cadena Substr dentro de la cadena S (Distingue mayúsculas de minúsculas). Si no la encuentra nos devuelve un cero (el primer elemento es el 1). Por ejemplo:

Pos( 'PALABRA', 'BUSCANDO UNA PALABRA' ) devuelve 14
Pos( 'palabra', 'BUSCANDO UNA PALABRA' ) devuelve 0

procedure ProcessPath( const EditText: string; var Drive: Char; var DirPart: string; var FilePart: string );

Este interesante procedimiento divide la cadena EditText la cual se supone que es una ruta como:

C:\Archivos de programa\MSN Messenger\msnmsgr.exe

en unidad, directorio y archivo. Vamos un ejemplo volcando la información en un Memo:

var
sRuta, sDirectorio, sArchivo: String;
cUnidad: Char;
begin
sRuta := 'C:\Archivos de programa\MSN Messenger\msnmsgr.exe';
ProcessPath( sRuta, cUnidad, sDirectorio, sArchivo );
Memo.Lines.Add( 'sUnidad=' + cUnidad );
Memo.Lines.Add( 'sDirectorio=' + sDirectorio );
Memo.Lines.Add( 'sArchivo=' + sArchivo );
end;

El resultado sería:

sUnidad=C
sDirectorio=\Archivos de programa\MSN Messenger
sArchivo=msnmsgr.exe

Nota: para que funcione esta función la ruta que le pasemos debe ser real, en caso contrario da un error.

En el próximo artículo terminaremos con este tipo de funciones.

Pruebas realizadas en Delphi 7.

09 agosto 2007

Operaciones con cadenas de texto (III)

Seguimos con funciones para manejo de cadenas de caracteres:

function AnsiReverseString( const AText: AnsiString ): AnsiString;

Esta función devuelve la cadena AText con los caracteres invertidos (de derecha a izquierda). Por ejemplo:

AnsiReverseString( 'Al revés' ) devuelve:

séver lA

AnsiReverseString( 'INVIRTIENDO UNA CADENA DE TEXTO' ) devuelve:

OTXET ED ANEDAC ANU ODNEITRIVNI

function AnsiRightStr( const AText: AnsiString; const ACount: Integer ): AnsiString;

Esta función devuelve la parte derecha de la cadena AText según el número de caracteres que le indiquemos en ACount. Por ejemplo:

AnsiRightStr( 'PROGRAMANDO CON DELPHI', 6 ) devuelve DELPHI
AnsiRightStr( 'PROGRAMANDO CON DELPHI', 11 ) devuelve CON DELPHI
AnsiRightStr( 'PROGRAMANDO CON DELPHI', 18 ) devuelve RAMANDO CON DELPHI

function AnsiStartsStr( const ASubText, AText: string ): Boolean;

Devuelve True si la cadena ASubText está al comienzo de la cadena AText (distingue mayúsculas y minúsculas). Veamos como funciona:

AnsiStartsStr( 'C:\', 'C:\Mis documentos\' ) devuelve True
AnsiStartsStr( 'c:\', 'C:\Mis documentos\' ) devuelve False

function AnsiStartsText( const ASubText, AText: string ): Boolean;

Esta función es igual a AnsiStartsStr salvo que no distingue mayúsculas de minúsculas. En el caso anterior:

AnsiStartsText( 'C:\', 'C:\Mis documentos\' ) devuelve True
AnsiStartsText( 'c:\', 'C:\Mis documentos\' ) devuelve True

function AnsiUpperCase( const S: string ): string;

Devuelve la cadena S convertida toda en mayúsculas. Veamos un par de ejemplos:

AnsiUpperCase( 'Programando con Delphi' ) devuelve:

PROGRAMANDO CON DELPHI

AnsiUpperCase( 'manipulando cada carácter de la cadena' ) devuelve:

MANIPULANDO CADA CARÁCTER DE LA CADENA

procedure AppendStr( var Dest: string; const S: string ); deprecated;

Este procedimiento esta obsoleto. Añade a la cadena Dest el contenido dela cadena S. Utilizar en su lugar el operador + o la función Contat.

function CompareStr( const S1, S2: string ): Integer;

Compara las cadenas de texto S1 y S2 y devuelve cero si son iguales. Si son distintas devuelve un número positivo o negativo según la diferencia de caracteres. La operación de diferencia de caracteres se realiza a nivel de cada carácter utilizando su valor equivalente en ASCII. Por ejemplo:

CompareStr( 'HOLA', 'HOLA' ) devuelve 0
CompareStr( 'HOLA', 'HOLa' ) devuelve -32
CompareStr( 'HOLa', 'HOLA' ) devuelve 32
CompareStr( 'HOLA', 'HOYA' ) devuelve -13

Esta función esta obsoleta. Se recomienda utilizar AnsiCompareStr en su lugar.

function CompareText( const S1, S2: string ): Integer;

Similar a la función CompareStr pero sin tener en cuenta mayúsculas y minúsculas. Según el ejemplo anterior:

CompareText( 'HOLA', 'HOLA' ) devuelve 0
CompareText( 'HOLA', 'HOLa' ) devuelve 0
CompareText( 'HOLa', 'HOLA' ) devuelve 0
CompareText( 'HOLA', 'HOYA' ) devuelve -13

Esta función esta obsoleta. Se recomienda utilizar AnsiCompareText en su lugar.

function Concat( s1 [, s2,..., sn]: string ): string;

Esta función devuelve concatenadas un número indeterminado de cadenas de texto que le pasemos como parámetro, aunque se recomienda utilizar el operador + en su lugar. Veamos un ejemplo:

Concat( '12', '34', '56', '78' ) devuelve 12345678
Concat( 'COMO', ' ESTÁN', ' USTEDES' ) devuelve COMO ESTÁN USTEDES

function Copy( S; Index, Count: Integer ): string;
function Copy( S; Index, Count: Integer ): array;


Ambas funciones devuelven una subcadena de la cadena S en la posición Index (el primer elemento es 1) y con una longitud de Count. Por ejemplo:

Copy( '123456', 1, 3 ) devuelve 123
Copy( '123456', 4, 2 ) devuelve 45
Copy( 'CAPTURANDO UNA PALABRA', 16, 7 ) devuelve PALABRA

También puede utilizarse para copiar elementos entre arrays de cualquier tipo. Por ejemplo vamos a crear un array de enteros y vamos a copiar una parte del mismo a otro:

var Origen, Destino: array of Integer;
i: Integer;
begin
SetLength( Origen, 6 );
Origen[0] := 10;
Origen[1] := 20;
Origen[2] := 30;
Origen[3] := 40;
Origen[4] := 50;
Origen[5] := 60;
Destino := Copy( Origen, 2, 4 );
for i := 0 to Length( Destino ) - 1 do
Memo.Lines.Add( Format( 'Destino[%d]=%d', [i,Destino[i]] ) );
end;

El resultado lo hemos volcado a pantalla dentro de un campo Memo mostrando lo siguiente:

Destino[0]=30
Destino[1]=40
Destino[2]=50
Destino[3]=60

En el próximo artículo seguiremos con más funciones.

Pruebas realizadas en Delphi 7.

08 agosto 2007

Operaciones con cadenas de texto (II)

Continuamos viendo funciones para manejo de cadenas de caracteres:

function AnsiIndexStr( const AText: string; const AValues: array of string ): Integer;

Esta función comprueba si alguna de las cadenas contenidas en el array AValues coincide extactamente con la cadena AText (distingue mayúsculas y minúsculas). Si la encuentra nos devuelve el número de índice del array donde se encuentra (empieza por cero), en caso contrario nos devuelve -1. Por ejemplo:

AnsiIndexStr( 'JUAN', ['CARLOS','PABLO','JUAN','ROSA'] ) devuelve 2
AnsiIndexStr( 'JUAN', ['CARLOS','PABLO','Juan','ROSA'] ) devuelve -1

Como vemos en el primer ejemplo nos dice que JUAN se encuentra en la posición 2 del array. Sin embargo en el sedungo ejemplo devuelve -1 porque JUAN es distinto de Juan.

function AnsiIndexText( const AText: string; const AValues: array of string ): Integer;

Funciona exactamente igual que la función AnsiIndexStr salvo que no distingue mayúsculas y minúsculas. Según el ejemplo anterior ambas llamadas a la función devuelven idéntico resultado:

AnsiIndexText( 'JUAN', ['CARLOS','PABLO','JUAN','ROSA'] ) devuelve 2
AnsiIndexText( 'JUAN', ['CARLOS','PABLO','Juan','ROSA'] ) devuelve 2

function AnsiLeftStr( const AText: AnsiString; const ACount: Integer ): AnsiString;

Esta función devuelve la parte izquierda de la cadena AText según el número de caracteres que le indiquemos en ACount. Sería algo así:

AnsiLeftStr( 'PROGRAMANDO CON DELPHI', 6 ) devuelve PROGRA
AnsiLeftStr( 'PROGRAMANDO CON DELPHI', 11 ) devuelve PROGRAMANDO
AnsiLeftStr( 'PROGRAMANDO CON DELPHI', 18 ) devuelve PROGRAMANDO CON DE

function AnsiLowerCase( const S: string ): string;

Devuelve la cadena S convertida toda en minúsculas (si tiene letras, naturalmente). Veamos un par de ejemplos:

AnsiLowerCase( 'Programando con Delphi' ) devuelve:

programando con delphi

AnsiLowerCase( 'MANIPULANDO CADA CARÁCTER DE LA CADENA' ) devuelve:

manipulando cada carácter de la cadena

Como vemos nos ha respetado la tílde en la palabra carácter.

function AnsiMatchStr( const AText: string; const AValues: array of string ): Boolean;

Esta función nos dice si alguna de las cadenas contenidas en el array AValues coincide exactamente con la cadena AText (comprobando mayúsculas y minúsculas). Aunque esta función pueda parecer igual a AnsiIndexStr se diferencia en que sólo responde True o False si la encontrado o no, al contrario que AnsiIndexStr que nos devuelve que la posición donde la ha encontrado. Con un ejemplo se ve mas claro:

AnsiMatchStr( 'JUAN', ['CARLOS','PABLO','JUAN','ROSA'] ) devuelve True
AnsiMatchStr( 'JUAN', ['CARLOS','PABLO','Juan','ROSA'] ) devuelve False

Nota: La ayuda de Delphi 7 dice que esta función devuelve un Integer y realmente devuelve un Boolean, será un error de documentación (ya estamos acostumbrados a la 'magnífica' documentación de Borland). En cambio si está corregido en la función:

function AnsiMatchText( const AText: string; const AValues: array of string ): Boolean;

Similar a la función anterior AnsiMatchStr pero sin diferenciar mayúsculas y minúsculas. Siguiendo el mismo ejemplo:

AnsiMatchText( 'JUAN', ['CARLOS','PABLO','JUAN','ROSA'] ) devuelve True
AnsiMatchText( 'JUAN', ['CARLOS','PABLO','Juan','ROSA'] ) devuelve True

function AnsiMidStr( const AText: AnsiString; const AStart, ACount: Integer ): AnsiString;

Devuelve un trozo de la cadena AText cuya posición comienza en AStart (el primer elemento es el 1) y cuyo número de caracteres viene determinado por ACount. Por ejemplo:

AnsiMidStr( 'PROGRAMANDO CON DELPHI', 7, 5 ) devuelve MANDO
AnsiMidStr( 'PROGRAMANDO CON DELPHI', 17, 6 ) devuelve DELPHI

function AnsiPos( const Substr, S: string ): Integer;

Devuelve la posición de la cadena Substr que está dentro de la cadena S. Si no la encuentra devuelve un cero (el primer elemento comienza por 1). También distingue entre mayúsculas y minúsculas. Veamos como funciona:

AnsiPos( 'PALABRA', 'BUSCANDO UNA PALABRA' ) devuelve 14
AnsiPos( 'Palabra', 'BUSCANDO UNA PALABRA' ) devuelve 0

function AnsiReplaceStr( const AText, AFromText, AToText: string ): string;

Esta función nos devuelve la cadena AText reemplazando las palabras que contenga según la variable AFromText sustituyéndolas por AToText. Tiene encuentra mayúsculas y minúsculas:

AnsiReplaceStr( 'CORRIGIENDO TEXTO DENTRO DE UNA FRASE', 'TEXTO', 'UNA PALABRA' ) devuelve:

CORRIGIENDO UNA PALABRA DENTRO DE UNA FRASE

AnsiReplaceStr( 'CORRIGIENDO TEXTO DENTRO DE UNA FRASE', 'Texto', 'UNA PALABRA' ) devuelve:

CORRIGIENDO TEXTO DENTRO DE UNA FRASE

Como vemos en el segundo ejemplo al no encontrar Texto por contener minúsculas ha dejado la frase como estaba.

function AnsiReplaceText( const AText, AFromText, AToText: string ): string;

Igual a la función AnsiReplaceStr sin distinguir mayúsculas y minúsculas:

AnsireplaceText( 'CORRIGIENDO TEXTO DENTRO DE UNA FRASE', 'TEXTO', 'UNA PALABRA' ) devuelve:

CORRIGIENDO UNA PALABRA DENTRO DE UNA FRASE

AnsireplaceText( 'CORRIGIENDO TEXTO DENTRO DE UNA FRASE', 'Texto', 'UNA PALABRA' ) devuelve:

CORRIGIENDO UNA PALABRA DENTRO DE UNA FRASE


El próximo artículo continuará con más funciones de manipulación de texto.

Pruebas realizadas en Delphi 7.

07 agosto 2007

Operaciones con cadenas de texto (I)

Delphi posee un amplio repertorio de funciones para el análisis y manipulación de cadenas de texto que nos harán la vida mucho más fácil una vez las conozcamos. Comencemos con ellas:

function AnsiCompareStr( const S1, S2: string ): Integer;

Esta función compara dos cadenas de texto carácter a carácter y nos dice si son iguales (diferencia mayúsculas y minúsculas). Si ambas cadenas son iguales devuelve un cero. Devolverá un 1 si la cadena S1 es superior a la cadena S2 y devuelve un -1 si la cadena S1 es inferior a la cadena S2. Veamos un ejemplo:

AnsiCompareStr( 'HOLA', 'HOLA' ) devuelve 0
AnsiCompareStr( 'HOLA', 'HOLa' ) devuelve 1
AnsiCompareStr( 'HOLa', 'HOLA' ) devuelve -1

¿Cuando se considera una cadena de texto superior a otra? Pues el orden es el siguiente:

Letras mayúsculas > Letras minúsculas
Letras minúsculas > Números

function AnsiCompareText( const S1, S2: string ): Integer;

Esta función es similar a AnsiCompareStr a diferencia de que no distingue entre mayúsculas y minúsculas. En el caso anterior:

AnsiCompareText( 'HOLA', 'HOLA' ) devuelve 0
AnsiCompareText( 'HOLA', 'HOLa' ) devuelve 0
AnsiCompareText( 'HOLa', 'HOLA' ) devuelve 0
AnsiCompareText( 'HOLA', 'HOLLA' ) devuelve -1
AnsiCompareText( 'HOLLA', 'HOLA' ) devuelve 1

El orden entre cadenas se define por:

Letras > Números

function AnsiContainsStr( const AText, ASubText: string ): Boolean;

Comprueba si la cadena ASubText esta dentro de la cadena AText. Por ejemplo:

AnsiContainsStr( 'DELPHI AL LIMITE', 'LIMITE' ) devuelve True
AnsiContainsStr( 'DELPHI AL LIMITE', 'LIMITe' ) devuelve False

function AnsiContainsText( const AText, ASubText: string ): Boolean;

Esta función es igual a AnsiConstainsStr salvo que no diferencia mayúsculas de minúsculas. Veamos un ejemplo:

AnsiContainsText( 'DELPHI AL LIMITE', 'LIMITE' ) devuelve True
AnsiContainsText( 'DELPHI AL LIMITE', 'LIMITe' ) devuelve True
AnsiContainsText( 'DELPHI AL LIMITE', 'LIMITES' ) devuelve False

function AnsiEndsStr( const ASubText, AText: string ): Boolean;

La función nos devuelve True si la cadena AText termina en la cadena ASubText. He aquí un ejemplo:

AnsiEndsStr( '.avi', 'C:\Archivos de programa\Emule\Incoming\pelicula.avi' ) devuelve True
AnsiEndsStr( '.AVI', 'C:\Archivos de programa\Emule\Incoming\pelicula.avi' ) devuelve False

Para este caso es mejor utilizar la función:

function AnsiEndsText( const ASubText, AText: string ): Boolean;

Esta función obtiene el mismo resultado que AnsiEndsStr pero sin diferenciar mayúsculas de minúsculas. En el caso anterior:

AnsiEndsText( '.avi', 'C:\Archivos de programa\Emule\Incoming\pelicula.avi' ) devuelve True
AnsiEndsText( '.AVI', 'C:\Archivos de programa\Emule\Incoming\pelicula.avi' ) devuelve True

Como vemos es ideal para comprobar extensiones de archivos.

En el próximo artículo seguiremos con muchas más funciones.

Pruebas realizadas en Delphi 7.

06 agosto 2007

Dando formato a los números reales

La unidad SysUtils dispone del tipo TFloatFormat siguiente:

type TFloatFormat = (ffGeneral, ffExponent, ffFixed, ffNumber, ffCurrency);

Este tipo es utilizado por las funciones CurrToStrF, FloatToStrF y FloatToText para dar formato a los números reales que pasen a formato texto. Como hemos visto anteriormente, los posibles valores de TFloatFormat son:

ffGeneral

Define el formato general de un número real acercando el valor resultante tanto como sea posible. Quita los ceros que se arrastran y la coma cuando sea necesario. No muestra ningún separador de miles y utiliza el formato exponencial cuando la mantisa es demasiado grande para el valor especificado según el formato. El formato de la coma es determinado por la variable DecimalSeparator.

Veamos un ejemplo mostrando el resultado en un campo Memo:

var rCantidad: Extended; // Número real para hacer pruebas
begin
rCantidad := 1234.56;

Memo.Lines.Add( 'General 4,0 = ' + FloatToStrF( rCantidad, ffGeneral, 4, 0 ) );
Memo.Lines.Add( 'General 6,0 = ' + FloatToStrF( rCantidad, ffGeneral, 6, 0 ) );
Memo.Lines.Add( 'General 6,2 = ' + FloatToStrF( rCantidad, ffGeneral, 6, 2 ) );
Memo.Lines.Add( 'General 3,2 = ' + FloatToStrF( rCantidad, ffGeneral, 3, 2 ) );

El resultado que nos muestra es el siguiente:

General 4,0 = 1235
General 6,0 = 1234,56
General 6,2 = 1234,56
General 3,2 = 1,23E03

Como vemos la función FloatToStrF toma los siguientes parámetros:

function FloatToStrF(Value: Extended; Format: TFloatFormat; Precision, Digits: Integer): string; overload;

Value es el número real que vamos a pasar a texto.
Format es el tipo de formato en coma flotante que vamos a utilizar (en este caso ffGeneral).
Precision es el número máximo de dígitos enteros que soporta el formato.
Digits es el número máximo de decimales que soporta el formato.

En el caso anterior cuando forzamos a mostrar menos dígitos de precisión de lo que el número real tiene lo que hace la función es recortar o bien decimales o si la cantidad entera es superior al formato lo pasa al formato exponencial.

Veamos el resto de formatos:

ffExponent

Muestra el número real en formato científico cuyo exponente viene representado con la letra E con base 10. Por ejemplo E+15 significa 1015. El carácter de la coma es representado por la variable DecimalSeparator.

Aquí vemos como queda el mismo número en distintos formatos exponenciales:

Memo.Lines.Add( 'Exponencial 4,0 = ' + FloatToStrF( rCantidad, ffExponent, 4, 0 ) );
Memo.Lines.Add( 'Exponencial 6,0 = ' + FloatToStrF( rCantidad, ffExponent, 6, 0 ) );
Memo.Lines.Add( 'Exponencial 6,2 = ' + FloatToStrF( rCantidad, ffExponent, 6, 2 ) );
Memo.Lines.Add( 'Exponencial 3,2 = ' + FloatToStrF( rCantidad, ffExponent, 3, 2 ) );

cuyo resultado es:

Exponencial 4,0 = 1,235E+3
Exponencial 6,0 = 1,23456E+3
Exponencial 6,2 = 1,23456E+03
Exponencial 3,2 = 1,23E+03

El formato ffFixed

Este formato no utiliza ningún separador de unidades de millar. Al igual que los formatos anteriores si la precisión del número real es superior al formato entonces muestra el resultado en notación científica. Quedaría de la siguiente manera:

Memo.Lines.Add( 'Fijo 4,0 = ' + FloatToStrF( rCantidad, ffFixed, 4, 0 ) );
Memo.Lines.Add( 'Fijo 6,0 = ' + FloatToStrF( rCantidad, ffFixed, 6, 0 ) );
Memo.Lines.Add( 'Fijo 6,2 = ' + FloatToStrF( rCantidad, ffFixed, 6, 2 ) );
Memo.Lines.Add( 'Fijo 3,2 = ' + FloatToStrF( rCantidad, ffFixed, 3, 2 ) );

dando los valores:

Fijo 4,0 = 1235
Fijo 6,0 = 1235
Fijo 6,2 = 1234,56
Fijo 3,2 = 1,23E03

El formato ffNumber

Es igual al formato ffFixed salvo que también incluye el separador de unidades de millar, el cual viene representado por la variable ThousandSeparator. En nuestro ejemplo:

Memo.Lines.Add( 'Número 4,0 = ' + FloatToStrF( rCantidad, ffNumber, 4, 0 ) );
Memo.Lines.Add( 'Número 6,0 = ' + FloatToStrF( rCantidad, ffNumber, 6, 0 ) );
Memo.Lines.Add( 'Número 6,2 = ' + FloatToStrF( rCantidad, ffNumber, 6, 2 ) );
Memo.Lines.Add( 'Número 3,2 = ' + FloatToStrF( rCantidad, ffNumber, 3, 2 ) );

mostraría:

Número 4,0 = 1.235
Número 6,0 = 1.235
Número 6,2 = 1.234,56
Número 3,2 = 1,23E03

El formato ffCurrency

Es similar al formato ffNumber pero con un símbolo de secuencia agregado, según se haya definido en la variable CurrencyString. Este formato también esta influenciado por las variables CurrencyFloat y NegCurrFloat. Sigamos el ejemplo:

Memo.Lines.Add( 'Moneda 4,0 = ' + FloatToStrF( rCantidad, ffCurrency, 4, 0 ) );
Memo.Lines.Add( 'Moneda 6,0 = ' + FloatToStrF( rCantidad, ffCurrency, 6, 0 ) );
Memo.Lines.Add( 'Moneda 6,2 = ' + FloatToStrF( rCantidad, ffCurrency, 6, 2 ) );
Memo.Lines.Add( 'Moneda 3,2 = ' + FloatToStrF( rCantidad, ffCurrency, 3, 2 ) );

Da como resultado:

Moneda 4,0 = 1.235 €
Moneda 6,0 = 1.235 €
Moneda 6,2 = 1.234,56 €
Moneda 3,2 = 1,23E03

según las variables mencionadas anteriormente que recogen el formato moneda por defecto configurado en Windows.

Pruebas realizadas en Delphi 7.

Publicidad