PDA

Ver la Versión Completa : Formato de numeros convertidos a texto


Anel Hernandez
07-10-2011, 19:07:25
Hola,

Tengo mis dudas sobre como convertir un numero almacenado en una variable con un formato determinado con alguna funcion de Delphi.

Por ejemplo, una variable que almacena el numero 5.1 quisiera convertirlo a texto con el el siguiente formato ' 5.100'.

Se hacerlo con el procedimiento str(), pero quisiera hacerlo con alguna funcion que me devuelva un string.

lo he eintentado con format y con FloatToStrF().

es posible hacerlo?

gracias

ecfisa
07-10-2011, 19:25:21
Hola Anel.

Usa FormatFloat.

Ejemplo:

var
st: string;
f: Double;
begin
f:= 5.1;
st:= FormatFloat('0.000',f);
ShowMessage(st);
...


Saludos.

Anel Hernandez
07-10-2011, 21:41:26
Hola,

parece ke el editor cometio un error, la idea es rellenar el numero con espacios en blanco delante y añadirle ceros detras!

' 5.100'.

El numero tiene 5 espacios en blanco delante y 2 ceros detras.

al parecer al copiar la primera vez el mensaje se borraron los espacios en blanco.

mil gracias!

ecfisa
07-10-2011, 22:57:03
Hola Anel.

El numero tiene 5 espacios en blanco delante y 2 ceros detras.
Si sólo se trata de agregarle 5 espacios delante y con dos cífras decimales sería:

var
st: string;
f: Double;
begin
f:= 5.1;
st:= ' '+FormatFloat('0.00', f);
// o del mismo modo se puede hacer st:= StringOfChar(' ', 5) + st;
Label1.Caption:= st;
...


Ahora si se trata de que rellene con espacios los caracteres que le faltan a la parte entera para llegar a 5, la cosa cambia un poco:

...
const
ESPACIOS = 5;
var
st: string;
f: Double;
begin
f:= 5.1;
st:= FormatFloat('0.00', f);
st:= StringOfChar(' ', ESPACIOS -Length(Copy(st, 1, Pos(DecimalSeparator, st)-1))) + st;
Label1.Caption:= st;
...


Un saludo.

Anel Hernandez
08-10-2011, 19:38:29
Hola,

Gracias. La ultima de las opciones es la que necesitaba. Eso mismo se puede hacer utilizando el procedimiento str().

La pregunta era si habia alguna funcion predefinida del delphi para hacerlo de una sola vez.

En varios pasos hay varias vias.

gracias

ecfisa
08-10-2011, 19:47:47
Hola Anel.

No existe una función o procedimiento predeterminado que realice lo que buscas. Se necesitan al menos dos pasos, como en el código que te puse arriba, para poder lograrlo.

Por supuesto que podés crearte una:

function FormatNum(const Num: Double; const Mask: string; const Spc: Integer): string;
begin
Result:= StringOfChar(' ', Spc - Length(Copy(Result, 1, Pos(DecimalSeparator, Result)-1))) + FormatFloat(Mask, Num);
end;


Uso:

Label1.Caption:= FormatNum(5.1, '0.000', 5);


Saludos.

Anel Hernandez
10-10-2011, 10:47:35
gracias ecfisa,

y si kisiera que el numero de ceros detras fuera variable? como puedo poner un mask variable? es decir que en vez de entrarle una mascara string le entre un byte con la cantidad de ceros ke kisiera.

:=FormatNum(5.1, 3, 5)?

mil gracias por tu ayuda!

Anel Hernandez
10-10-2011, 11:32:31
ecfisa,

he estado probando la funcion y si el numero es entero la posicion del separador da cero y no da un buen resultado. Me parece que seria mejor contando la parte entera:
-Length(floattostr(trunc(num)))

Quedaria solo poderle poner a la funcion la cantidad de ceros decimales a elegir.

mil gracias

ecfisa
10-10-2011, 20:12:29
gracias ecfisa,

y si kisiera que el numero de ceros detras fuera variable? como puedo poner un mask variable? es decir que en vez de entrarle una mascara string le entre un byte con la cantidad de ceros ke kisiera.

:=FormatNum(5.1, 3, 5)?

mil gracias por tu ayuda!
Hola.


function FormatNum(const Num: Double; const Ceros: Byte; const Spc: Integer): string;
begin
if Round(Num) <> Num then // flotante
Result:= StringOfChar(' ', Spc - Trunc(Ln(Num)/Ln(10))+1) + FormatFloat('0.' + StringOfChar('0',Ceros), Num)
else // entero
Result:= StringOfChar(' ', Spc - Trunc(Ln(Num)/Ln(10))+1) + IntToStr(Trunc(Num)) + StringOfChar('0', Ceros);
end;


Llamada ejemplo:

ShowMessage(FormatNum(123.1, 5, 0) + #10#13 + FormatNum(2, 5 , 3));


Saludos.