Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema con FloatToStr (https://www.clubdelphi.com/foros/showthread.php?t=77387)

Kubelo 20-01-2012 12:24:10

Problema con FloatToStr
 
Hola, en primer lugar agradecer la molestia de leer mi problema y ayudarme.

Vamos a ver, tengo una función tal que así:

Código Delphi [-]
procedure TNuevoEdit.SetFloat(ValorFloat: Double);
begin
 if Tipo = TipoFloat then Text := FloatToStr(ValorFloat);
end;

Bien el problema que me he encontrado es que al pasar un valor tipo (ValorFloat = 1e-05) me pasa a partir de 5 decimales, ya que sino el valor llega como 0,0001. Pues bien en los casos que coge exponenciales al final el text se me pasa como un valor negativo.

Por ejemplo:

(0,00001) -> 1e-05 -> Text = -15
(0,00002) -> 2e-05 -> Text = -25

Es muy curioso pero me esta resultando un quebradero de cabeza. Así que espero ideas para que al final me quede como tiene que quedar, es decir:

1e-05 -> Text = 0,00001
2e-05 -> Text = 0,00002

Gracias de nuevo

ecfisa 20-01-2012 16:23:33

Hola Kubelo.

Fijate si te sirve de este modo:
Código Delphi [-]
procedure TNuevoEdit.SetFloat(Value: Double);
begin
  Text:= FormatFloat('0.##########', Value);
end;


Saludos.

Kubelo 20-01-2012 16:47:16

Pero eso siempre me devolverá decimales, y no tiene q ser así, debe devolver el valor correcto con o sin decimales.

Además el número de decimales puede variar dependiendo de donde se use el Edit que estoy desarrollando.

Gracias

TiammatMX 20-01-2012 17:04:31

¿Y si utilizas Trunc(), no te sirve lo mismo? Digo, si lo que deseas es eliminar los decimales, es tu mejor opción...

Kubelo 20-01-2012 17:08:27

No quiero eliminar los decimales, el problema es q cuando llega un 1e-05 en lugar de pintar 0,00005 que sería lo correcto, me pinta -15. Jejejee

ecfisa 20-01-2012 19:32:44

Cita:

Empezado por Kubelo (Mensaje 423395)
No quiero eliminar los decimales, el problema es q cuando llega un 1e-05 en lugar de pintar 0,00005 que sería lo correcto, me pinta -15. Jejejee

Tál como está tu código, lo correcto es que muestre 1E-5. Lo que no entiendo a que puede deberse que te muestre -15... :eek:

Realicé una prueba sencilla que te adjunto por si te sirve:
Código Delphi [-]
...
implementation  {$R *.dfm}

type
  TNuevoEdit = class(TEdit)
  private
    FFloat: Double;
    procedure SetFloat(Value: Double);
  public
    property Float: Double read FFloat write SetFloat;
  end;


procedure TNuevoEdit.SetFloat(Value: Double);
begin
  Text:= FloatToStr(Value);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TNuevoEdit.Create(Self) do
  begin
    Parent:= Self;
    Float := 0.00001;
  end;
end;
y el resultado es 1E-5, tál como se esperaría de la conversión efectuada:



Pero hay algo que todavía no me termina de quedar claro y es: ¿ Que formato de salida (exáctamente) deseas en la propiedad Text de TNuevoEdit ?

Un saludo.

Kubelo 20-01-2012 19:36:26

El tema es que necesito que devuelva 0,00001. Ahí radica el problema. Si, se que es raro, pero por eso os pido ayuda a los gurús :D:D:D:D

Casimiro Notevi 20-01-2012 19:49:53

Ahora sí que no lo entiendo :confused:

ecfisa 20-01-2012 19:50:47

Cita:

Empezado por Kubelo (Mensaje 423422)
El tema es que necesito que devuelva 0,00001. Ahí radica el problema. Si, se que es raro, pero por eso os pido ayuda a los gurús :D:D:D:D

Probá con esta máscara:
Código Delphi [-]
  Text:= FormatFloat('0.##.########', Value);

Por ejemplo:
Código:

Value =  0.00001 , resultado: 0,00001
Value = 123      , resultado: 123
Value = 567.88    , resultado: 567,88
...

Es un problema de máscaras, busca en la ayuda de Delphi por 'FormatFloat'

Saludos.

Kubelo 20-01-2012 19:58:26

Ya salí del trabajo, el lunes lo pruebo, pero si le llega 1e-05 también funciona? Jejeje Ahí me queda la duda durante el fin de semana...

Jejeje

Gracias por vuestro tiempo, sois geniales!

Kubelo 23-01-2012 08:43:59

Buenas de nuevo, la opción
Código Delphi [-]
FormatFloat('0.##.########', VFloat);
tal y como esperaba no me sirve, ya que a parte de seguir poniendo el valor en negativo, ahora me añade los decimales, y no es lo que busco.

Espero alguna idea más a ver si consigo desenredarme! Jeje

Gracias de nuevo

Casimiro Notevi 23-01-2012 11:43:08

En lugar de un double, ¿puedes usar un currency?

Kubelo 23-01-2012 13:16:34

Hola Casimiro, no, ha de ser un float, ya que a ese campo le puede llegar cualquier cosa.

Es uno de los inconvenientes.

Gracias

amadis 23-01-2012 15:58:54

Prueba con el comando FloatToStrF

Es un comando practico que permite sobrecarga y te pasa el resultado a donde quieras, variable o al edit.

Aqui dejo una ayuda.

The FloatToStrF function converts a floating point number Value into a displayable string, with great control over the formatting via the Format, Precision, and Digits values.

The Value type may be any of the floating point types.

The Format parameter is defined by the TFloatFormat (SysUtils) type :
ffCurrency eg : ?2,345.60
ffExponent eg : 2.3456E+04
ffFixed eg : 2345.60
ffGeneral eg : 2345.6
ffNumber eg : 2,345.6

ecfisa 23-01-2012 18:44:39

Hola Kubelo.

Sigo sin entender como es posible (dado el código que presentaste) que enviándo como argumento a SetFloat el valor 0.00001 obtengas el resultado -15. :confused:
Eso me hace preguntar si no tendrás algún problema con Delphi...


Saludos.

Kubelo 23-01-2012 19:40:20

Cita:

Empezado por ecfisa (Mensaje 423567)
Hola Kubelo.

Sigo sin entender como es posible (dado el código que presentaste) que enviándo como argumento a SetFloat el valor 0.00001 obtengas el resultado -15. :confused:
Eso me hace preguntar si no tendrás algún problema con Delphi...


Saludos.

Creo que nos hemos malentendido ecfisa, a la función no le llega 0,000001, sino 1e-05, pero realmente lo original si es 0,000001. No se si ahora me he expresado con claridad.

Mañana sin falta pruebo el FloatToStrF, me dejaste intrigado amadis.

Gracias a todos!

ecfisa 23-01-2012 20:55:34

Cita:

Empezado por Kubelo (Mensaje 423570)
Creo que nos hemos malentendido ecfisa, a la función no le llega 0,000001, sino 1e-05, pero realmente lo original si es 0,000001. No se si ahora me he expresado con claridad.

Mañana sin falta pruebo el FloatToStrF, me dejaste intrigado amadis.

Gracias a todos!

En realidad si el envías 0.00001, 1E-05, 1/100000 o 10 ^(-5) es indiferente ya que estamos hablando del mismo número representado en formatos diferentes. Lo que no entiendo es como obtenes los resultados -15 y -25.

Utilizando el número 1E-05 o 0.00001, tanto con FloatToStrF como con FormatFloat obtenés el resultado esperado: 0,00001
Código Delphi [-]
...
var
  x: Double;
begin
  x:= 1E-05; // del mismo modo funciona con: 12325,12345/-12345,12345, 56789.00003/-56789.00003, etc
  ShowMessage(FloatToStrF(x, ffFixed,10, 5)     // 0,00001
              +#10#13+
              FormatFloat('0.##.########', x)); // 0,00001
Sigo sin entender el problema... ¿ Podés ponernos algunos valores que enviados a SetFloat te provocan resultados indeseados ?

Saludos.

Kubelo 24-01-2012 08:32:30

Bueno pues tal y como me temía el FloatToStrF, tampoco funciona.

ecfisa, los valores que me fallan son siempre 0,0000... a partir de 5 decimales que es cuando lo pasa a exponencial, y siempre "0,", es decir el valor 1,00001 lo coge bien, pero el 0,00001 ya no lo coge bien.

Gracias

Casimiro Notevi 24-01-2012 09:02:07

Y de dónde salen esos números, ¿una función, un reloj, al azar, algún usuario que los escribe?

Kubelo 24-01-2012 09:18:43

Cita:

Empezado por Casimiro Notevi (Mensaje 423594)
Y de dónde salen esos números, ¿una función, un reloj, al azar, algún usuario que los escribe?

Introducidos por el usuario.


La franja horaria es GMT +2. Ahora son las 14:41:32.

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