Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Error de conversion (https://www.clubdelphi.com/foros/showthread.php?t=74569)

aams01 27-06-2011 04:44:21

Error de conversion
 
Hola de ante mano gracias a todos.
Tengo un problema si no lo tuviera no pondria el hilo jiji.
el problema en si es de conversion para no hacer grande la cosa es este
Código:

    Float=1000;
    SGMateriales->Cells[4][Renglon] = FormatFloat("###,###,###.##", Float); // quedaria    SGMateriales->Cells[4][Renglon] = 1,000

    Float = StrToFloat(SGMateriales->Cells[4][Renglon]); // Aqui mi error
    Float = SGMateriales->Cells[4][Renglon].ToDouble();// nuevamente error

En este se puede observar q le doy formato y despues lo quiero convertir a Flotante, cosa q no se puede por no ce que razon si los separadores de miles es "," alguna sugerencia para corregirlo
Perdon si reposte error con Telmex Internet

aams01 27-06-2011 08:15:01

Solucion absurda es quitar las ","
Float = AnsiReplaceStr(SGMateriales->Cells[4][Renglon],",","");

ecfisa 27-06-2011 16:27:21

Hola aams01.

No entiendo el por que de:
Código:

  Float = StrToFloat(SGMateriales->Cells[4][Renglon]);
Siendo que el valor sigue estando en la variable Float...

Pero si de todas formas queres realizar la conversión tenes que quitar el formato. Tendrías que hacerlo sobre una variable auxiliar,
para que no cambie la presentación en la grilla:
Código:

Double Float = 1015.28; // valor de ejemplo
 SGMateriales->Cells[4][Renglon] = FormatFloat("###,###,###.##", Float);
 String Aux = SGMateriales->Cells[4][Renglon];
 char sep = DecimalSeparator;          // guardar separador decimal
    Aux.Delete(Aux.Pos('.'),1);        // eliminar '.'
    Aux = AnsiReplaceStr(Aux,",","."); // cambiar ',' por '.'
    DecimalSeparator = '.';            // separador decimal = '.'
    /* CONVERTIR */
    Float = Aux.ToDouble();
    Float = StrToFloat(Aux);
    DecimalSeparator = sep;            // restaurar sep. decimal

Y más sencillo todavia:
Código:

Double Float = 1000.28;
 String Aux = FloatToStr(Float);
 SGMateriales->Cells[1][1] = FormatFloat("###,###,###.##", Float);
    /* CONVERTIR */
    Float = Aux.ToDouble();
    Float = StrToFloat(Aux);

Pero insisto que no veo el sentido de las conversiones si el valor ya está en la variable Float.

Saludos.

aams01 27-06-2011 19:35:14

Hola gracias por responder, la verdad yo tampoco le veo el sentido ni logica pero no me permite guardar a flotante por que tien una ',' y eso q esta como separador de miles. por eso de tener que quitar las ','. Gracias si tubieses alguna explicacion a este error seria de mucha ayuda.

El echo de Float = StrToFloat(SGMateriales->Cells[4][Renglon]); no es tanto en si por el echo de si tengo o no el valor 2 renglones arriba, lo que pasa es que no quise poner tanto codigo,
tengo un StringGrid en el cual tengo varios campos (id, nombre.....precio, Cantidad, Importe=precio * Cantidad) pero como al usuario le agradan las cosas faciles de dijerir uso los separadores de miles ',' despues de esa operacion tambien sumo el resultado de la columa Importe esto lo ago con una funcion q recorre todo el StrinGrid

ecfisa 27-06-2011 23:45:10

Cita:

Gracias si tubieses alguna explicacion a este error seria de mucha ayuda
El motivo es que la representación interna admitida para un número flotante es: [parte_entera] [punto] [parte_decimal]
Tomando como ejemplo el número ciento veinticinco mil con doce, C++ Builder lo representa: 125000.12
Pero al darle el formato con la máscara queda: 125,000.12, representación numérica que no tiene un formato aceptado por C++ Builder.
Y eso mismo es lo que indica el mensaje de error: '125,000.12' is not a valid floating point value, al intentar la conversión de esa cadena.
El echo de que C++ Builder muestre el separador decimal como un punto o una coma es manipulable mediante:
Código:

  DecimalSeparator = '.';  // muestra: 125.000.12
  // o
  DecimalSeparator = ',';  // muestra: 125.000,12

Pero es sólo al efecto de ser mostrado, internamente se sigue manejando el formato [parte_entera] [punto] [parte_decimal], es por eso que
no genera error si paso previo a la conversión hacemos:
Código:

  Aux = "125.000,12";
  Aux.Delete(Aux.Pos('.'),1);
  StrToFloat(Aux);

Ya que de esta manera se elimina el primer '.' empezando de la izquierda y queda con el formato requerido.


Saludos.


La franja horaria es GMT +2. Ahora son las 11:52:22.

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