Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Formato de numeros convertidos a texto (https://www.clubdelphi.com/foros/showthread.php?t=76085)

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

Formato de numeros convertidos a texto
 
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:
Código Delphi [-]
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

re
 
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.

Cita:

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:
Código Delphi [-]
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:
Código Delphi [-]
...
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

re
 
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:
Código Delphi [-]
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:
Código Delphi [-]
 Label1.Caption:= FormatNum(5.1, '0.000', 5);

Saludos.

Anel Hernandez 10-10-2011 10:47:35

re
 
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

re
 
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

Cita:

Empezado por Anel Hernandez (Mensaje 415063)
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.

Código Delphi [-]
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:
Código Delphi [-]
   ShowMessage(FormatNum(123.1, 5, 0) + #10#13 + FormatNum(2, 5 , 3));

Saludos.


La franja horaria es GMT +2. Ahora son las 12:45:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi