Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   aproximar numero hasta dos decimales (https://www.clubdelphi.com/foros/showthread.php?t=6825)

Letty 23-01-2004 16:58:39

aproximar numero hasta dos decimales
 
Hola!:
Mi duda es la siguiente:
¿cómo puedo convertir en delphi un float a entero y que me corte directamente los decimales? Tengo k hacer un programa que metiendo un número flotante me abrevie ese número a sólo dos decimales en delphi. Y más o menos tengo la idea básica pero si se pudiera cortar todos los decimales como cuando pasas un flotante a entero en c.... bye y gracias adelantadas.

__cadetill 23-01-2004 18:00:46

puedes hacerlo de muchas maneras, todo depende de lo que quieras conseguir

Trunc(MiReal * 100) / 100
FormatFloat('#,##0.00', MiReal)
.....

No se, explica un poco más que es lo que quieres conseguir

Letty 26-01-2004 22:12:37

Gracias y listo.
 
Hola!:
Ya he solucionado el problema. Muchas gracias por responder. Al final lo solucioné con la función formatfloat que por muy raro que suene, la desconocía. Gracias Cadetill y hasta pronto. No he podido responder antes. :rolleyes:

Letty 27-01-2004 21:15:21

Otra vez dudas tontas
 
Hola de nuevo:
Tengo el siguiente problema:
Yo hago lo siguiente al pulsar un botón:

procedure TForm1.Button1Click(Sender: TObject);
var
numero : real;
st : string;

begin

st:= ednumero.Text;
st:= FormatFloat('#,##.00',strtofloat(st));
ShowMessage(st); //aquí muestra el mensaje perfectamente,todo muy bien
numero:= StrToFloat(st);

Y justo en el paso de string a float me da un error diciendo que ese no es un valor float [project project1.exe raised exception class eConvertError with message “1.000,00’ is not a valid floating point value’.Proccess stopped], yo no lo entiendo. A ver si me podéis ayudar por favor porque es algo rarísimo.
Gracias de antemano.

__cadetill 27-01-2004 23:02:18

Es normal, porque al ponerle el formato, le estás añadiendo el punto de los millares que, al hacer la transformación, no sabe que es.

Puedes hacer varias cosas:

1.- No pones en la máscara el punto de los millares (algo así 0.00)
2.- Te curras una función que te quite el separador de millares y que te haga (ya que estmamos) la conversión de tipos
3.- Accedes otra vez al componente para recuperar de nuevo el valor

roman 27-01-2004 23:34:43

Disculpa cadetill pero a mi me parece que el error no está en FormatFloat sino en StrToFloat. De la ayuda de Delphi:

Cita:

Thousand separators and currency symbols are not allowed in the string
Es decir, StrToFloat sólo admite representaciones de números reales sin "adornos" com lo es el separador de miles.

// Saludos

__cadetill 28-01-2004 09:59:58

Quedas disculpado Román pero, yo no decía (o no pretendía decir) que el error fuera del FormatFloat. Si te fijas, decía en mi mensaje anterior :

Cita:

al hacer la transformación, no sabe que es
refiriendome a que era StrToFloat el que no sabía que hacer con esa cadena (como tu bien indicas, por los adornos puestos en el FormatFloat).

Por eso una de las coss que le sugería, era no poner los odornos (opción 1), para que StrToFloat supiera que hacer con el numerito en qüestión.

Nos leemos ;)

roman 28-01-2004 10:45:33

Cita:

Empezado por cadetill
Por eso una de las coss que le sugería, era no poner los odornos (opción 1), para que StrToFloat supiera que hacer con el numerito en qüestión.

Disculpa nuevamente que difiera. Tú dijiste:

Cita:

Empezado por cadetill
No pones en la máscara el punto de los millares (algo así 0.00)

Y la máscara no afecta a StrToFloat.

// Saludos

__cadetill 28-01-2004 12:07:39

Cita:

Empezado por roman
Y la máscara no afecta a StrToFloat.

Bueno, no es del todo cierta esta afirmación. Me explico:

Suponiendo que el número a tratar es 1234.56

Si pongo una máscara tal que esta: #,##0.00 el FormatFloat nos devolverá un string tal que este 1.234,56, con lo que la función StrToFloat nos fallará debido a lo que ya se ha comentado

En cambio, si pongo una máscara tal que esta: 0.00, el FormatFloat nos devolverá un string así 1234,56 con lo que la función StrToFloat no nos fallará ya que es un número válido (sin adornos)

Repito que no es problema del FormatFloat (éste hace bien su trabajo), sinó de la manera de interpretar el string que se le pasa al StrToFloat.

roman 28-01-2004 17:11:29

Ya nos estamos desviando :D .

Volvamos al mensaje #4 donde se nos informa:

Cita:

Empezado por compilador de Delphi
eConvertError with message “1.000,00’ is not a valid floating point value’

Esta excepción la manda StrToFloat y no FormatFloat. Es decir, el problema está antes de que FormatFloat intervenga, apenas se están valuando sus parámetros.

Tu dices

Cita:

Empezado por cadetill
Si pongo una máscara tal que esta: #,##0.00 el FormatFloat nos devolverá un string tal que este 1.234,56, con lo que la función StrToFloat nos fallará debido a lo que ya se ha comentado

pero no es StrToFloat quien usa lo que devuelve FormatFloat sino alrevés: FormatFloat usa lo que devuelve StrToFloat.

StrToFloat, en el código original, es un parámetro de FormatFloat y estarás de acuerdo en que los parámetros de una función se evalúan antes que la función.

// Saludos

__cadetill 28-01-2004 17:41:16

mmmmm, esto..... me parece que nos estamos liando :D :D :D

Veamos el código que nos manda nuestro colega ;)

Código:

procedure TForm1.Button1Click(Sender: TObject);
var
  numero : real;
  st : string;
begin
  st:= ednumero.Text;
  st:= FormatFloat('#,##.00',strtofloat(st));
  ShowMessage(st); //aquí muestra el mensaje perfectamente,todo muy bien
  numero:= StrToFloat(st);

Bien, yo entiendo que la linea
Código:

  st:= FormatFloat('#,##.00',strtofloat(st));
le funciona correctamente, por lo que aquí no hay error ni con StrToFloat ni con FormatFloat :p
Esto lo deduzco por lo que pone en la siguiente linea:
Código:

  ShowMessage(st); //aquí muestra el mensaje perfectamente,todo muy bien
Por lo que creo que el error está en la útima línea de código
Código:

  numero:= StrToFloat(st);
Donde, una vez hecha la transformación con el FormatFloat (que le ha funcionado bien) intenta volver a transformar el string logrado a un real y, es aquí donde se le presenta el error ya que el string lleva formato

Por eso le recomendaba que no pusiera formato (separador de millares) y, así, esta segunda transformación no le daría problemas

Quizás tu te referias al primer StrToFloat??? Si es así, sí que te doy la razón :D

marto 28-01-2004 17:44:17

Cita:

Empezado por roman
pero no es StrToFloat quien usa lo que devuelve FormatFloat sino alrevés: FormatFloat usa lo que devuelve StrToFloat.

¿Estás seguro de eso?

Código:


procedure TForm1.Button1Click(Sender: TObject);
var
  numero : real;
  st : string;
begin
  st:= ednumero.Text;
  st:= FormatFloat('#,##.00',strtofloat(st));
  ShowMessage(st); //aquí muestra el mensaje perfectamente,todo muy bien
  //Hemos pasado el FomatFloat bien, ya que ednumero.Text estaba sin
  //adornar pero ahora st ya tiene "adornos"
  numero:= StrToFloat(st);
  //aqui es donde peta, ya que le pasamos a StrToFloat
  //el resultado de FormatFloat
end;


marto 28-01-2004 17:45:48

Cadetill, me ganaste en la respuesta por dos minutos!!!!

roman 28-01-2004 17:56:23

Cita:

Empezado por cadetill
mmmmm, esto..... me parece que nos estamos liando :D :D :D

¡Qué gentil por el uso del plural pero ya ví mi error! :D

Marto uy tú tienen toda la razón. Es que yo, como compilador omito los comentarios :D y la prueba que hice fue sólo hasta el primer StrToFloat y pensé que Letty dejaba que el usuario escribiera en el Edit los "adornos".

Siendo como me han hecho ver el asunto es clarísimo: A StrToFloat sólo pueden pasársele números reales de " a de veras": dígitos, coma (o punto) decimal, + o - y la E de notación exponencial, y no adornados como sucede en la segunda llamada

// Disculpas

pd: Lo naranja fue añadido.

__cadetill 28-01-2004 18:01:07

Cita:

Empezado por roman
// Disculpas

Faltaría más!!!! no eran necesarias ;)


La franja horaria es GMT +2. Ahora son las 02:40:25.

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