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.

No hay comentarios:

Publicidad