Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-02-2016
feliz-58 feliz-58 is offline
Miembro
 
Registrado: sep 2012
Posts: 314
Poder: 12
feliz-58 Va por buen camino
Post Error "No es un valor flotante Valido"

Saludos Club, traigo algo que es común pero que no logro entender (Soy novato ), tengo este error pero no solo quiero que me expliquen como resolverlo sino porque ocurre para evitarlo en el futuro.

este es el código:

Código Delphi [-]
var
i : integer;
begin
   For i:=1 to SG.RowCount-1 do
      SubTotal := SubTotal + StrToFloat(SG.Cells[4,i]);

// Calculando el monto para cobrar el impuesto de ventas
   For i:=1 to SG.RowCount-1 do
      If SG.Cells[5,i] = 'Si' then Impuesto :=  Impuesto + StrToFloat(SG.Cells[4,i]);
 SubTotal := Round(SubTotal);
   Desc := (SubTotal * PorcDesc.Value / 100);
   Desc := Round(Desc);
   Impuesto := Impuesto * 0.18;
   Impuesto := Round(Impuesto);
   Total := (SubTotal - Desc + Impuesto);
   // escribe los valores en las celdas
   SGT.Cells[1,1] := Format('%8.2n',[desc]);
   SGT.Cells[1,2] := Format('%8.2n',[Impuesto]);
   SGT.Cells[1,0] := Format('%8.2n',[SubTotal]);
   SGT.Cells[1,3] := Format('%8.2n',[Total]);
end;

me da error cuando en el StringGrid tengo cantidades en Formato 1,234.00 por el asunto de la coma, como lo resuelvo y porque pasa?

Gracias
Responder Con Cita
  #2  
Antiguo 12-02-2016
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Buenos días.

El tema es que la cadena "1,234.00" no es un valor numérico válido. Sólo puede haber un punto decimal, sin comas ni apóstrofes. Es decir, que debería ser "1234.00" ó, dependiendo de la configuración e implementación, "1234,00".
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 12-02-2016
feliz-58 feliz-58 is offline
Miembro
 
Registrado: sep 2012
Posts: 314
Poder: 12
feliz-58 Va por buen camino
Cita:
Empezado por Ñuño Martínez Ver Mensaje
Buenos días.

El tema es que la cadena "1,234.00" no es un valor numérico válido. Sólo puede haber un punto decimal, sin comas ni apóstrofes. Es decir, que debería ser "1234.00" ó, dependiendo de la configuración e implementación, "1234,00".
ok, ahora como lo resuelvo? sin que cambien la presentación del numero al cliente.
Responder Con Cita
  #4  
Antiguo 12-02-2016
Avatar de TiammatMX
TiammatMX TiammatMX is offline
Miembro
 
Registrado: jun 2006
Ubicación: Universo Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Puebla\Heróica Puebla de Zaragoza\Jardines de San Manuel\Home
Posts: 746
Poder: 18
TiammatMX Va camino a la fama
Cita:
Empezado por feliz-58 Ver Mensaje
... pero no solo quiero que me expliquen como resolverlo sino porque ocurre...



De entrada, independientemente del "tema" para números, fechas y demás que tiene Winbugs, que diga, Windows, los números CON DECIMALES se expresan "999999999[.]9999", así que tu número debe ser expresado CON UN PUNTO separando los enteros de los decimales...

La plantilla de presentación depende directamente de la presentación numérica regional.
__________________
Felipe Eduardo Ortiz López. Delphi programmers does it recursively...

"Un programador, es un creador de universos en donde sólo él es responsable. Universos de complejidad prácticamente ilimitada que se puede crear en forma de programas de ordenador." - Joseph Weizenbaum.

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco
Responder Con Cita
  #5  
Antiguo 12-02-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Hay varias maneras..

1. Las funciones para aplicar formato a strings siempre cuentan con una version sobrecargada (overloaded) que reciben un parametro adicional; un record de tipo TFormatSettings donde se especifica como se debe aplicar dicho formato

Ademas esta forma es thread-safe

2. Evidentemente, cuando no se usa la version sobrecargada, se emplea una variable FormatSettings, definida en System.SysUtils
Este record global es inicializado automaticamente por Delphi, y se carga con la informacion de la configuracion regional del sistema operativo. Asi que otra alternativa es modificar lo que tiene este registro global y todas las llamadas a las funciones ahora usaran la nueva configuracion.

Esta version no es thread-safe

Tambien existe una propiedad en el objeto Application, la UpdateFormatSettings
que es una bandera Booleana. Por defecto esta a True, y significa que tu aplicacion al recibir una notificacion de Windows cuando el usuario cambia la config. regional, actua en consecuencia y actualiza el registro FormatSettings global; si optas por esta opcion, podrias considerar dejar esta opcion a False

Esas son las 2 formas mas generales, rapidas y faciles de implementar


Por otro lado, leyendo tu codigo parece que estas manipulando valores monetarios. En ese caso desaconsejo el uso de los tipos float, real, double, single, extended. Lo mas adecuado es usar el tipo Currency, que es representado internamente como un entero y por lo tanto tenes mayor precision; los numeros en coma flotante no son exactos y puede dar lugar a algunos "problemillas"

Para convertir de tipo Currency a string y viceversa podes usar las funciones:

Código Delphi [-]
  CurrToStr(1234.56);
  CurrToStr(1234.56, RegistroTFormatSettings);

  CurrToStrF(1234.56, TFloatFormat, que es un tipo enumerado, cada uno representa un tipo distinto de formato);

Sobre esta ultima variante CurrToStrF podes ver aca ejemplos de uso y la salida

Saludos

Última edición por AgustinOrtu fecha: 12-02-2016 a las 19:51:52.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
El "problema" de los números reales (coma flotante) Casimiro Notevi La Taberna 4 09-01-2013 21:11:18
Error delphi "valor no puede ser nulo nombre del parametro key" nickolas Varios 0 21-08-2012 03:07:45
Reemplazar "," por ":" en un punto flotante DTAR SQL 2 10-05-2006 00:55:07
Añadir signo "+" a una variable flotante Ricsato Varios 2 18-06-2005 01:53:03
convertir la cadena "1.8376e+01" a numero flotante franciscobucio Varios 0 22-10-2004 23:49:47


La franja horaria es GMT +2. Ahora son las 16:52:37.


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
Copyright 1996-2007 Club Delphi