Fórum Is not a valid floating point value #343605
24/07/2007
0
Is not a valid floating point value.
Jpauloss
Curtir tópico
+ 0Posts
24/07/2007
Jáder Medeiros
Gostei + 0
25/07/2007
Jax
procedure TForm1.Button1Click(Sender: TObject); var V : Double; begin V := StrToFloat(StringReplace(Edit1.Text, ´,´, DecimalSeparator, [])); end;
O segundo parametro do StringReplace indica o caracter que está incorreto, ou seja, vc está passando uma virgula aonde deveria ser ponto por exemplo.
Gostei + 0
25/07/2007
Jpauloss
procedure TForm1.Button1Click(Sender: TObject); var V : Double; begin V := StrToFloat(StringReplace(Edit1.Text, ´,´, DecimalSeparator, [])); end;
Então Fica assim:
procedure TForm1.Button1Click(Sender: TObject); var V : Double; begin V := StrToFloat(StringReplace(Edit1.Text, ´,´, ´.´, [])); end;
Isso mesmo? Outra coisa como faço para o banco entender vígula ao invés de ponto?
Gostei + 0
25/07/2007
Jax
já no seu aplicativo vc pode definir manualmente o separador decimal (DecimalSeparator) que desejar.
DecimalSeparator := ´.´;
Gostei + 0
27/07/2007
Djjunior
function MeuStrToFloat(s: string): Extended;
begin
Result := 0;
try
if s = ´´ then
begin
s := ´0´;
exit;
end;
Result := StrToFloat(AnsiReplaceStr(s, ThousandSeparator, ´´));
except
messageDlg(Format(´Valor ¬S Não é um valor valido´), [s]), True);
end;
end;
desta forma sempre que preciso do StrToFloat uso o MeuStrToFloat ai é só fazer o mesmo com o strToInt
Gostei + 0
30/07/2007
Jax
Você sabe o que é o ThousandSeparator?
ThousandSeparator é o separador de milhares e pode variar dependendo das configurações regionais do sistema operacional em que o programa estiver rodando.
Desaconselho o uso de ThousandSeparator, porque se o windows for PT-BR, ThousandSeparator será o Ponto. Já em EN-US o ThousandSeparator será a virgula.
Ex:
PT-BR: 1.121.956,85
EN-US: 1,121,956.85
Melhore sua função para evitar problemas futuramente.
Gostei + 0
30/07/2007
Emerson Nascimento
function MeuStrToFloat(s: string): Extended; begin Result := 0; try if s = ´´ then s := ´0´; Result := StrToFloat(AnsiReplaceStr(s, ThousandSeparator, ´´)); except messageDlg(Format(´Valor ¬S Não é um valor valido´), [s]), True); end; end;
Gostei + 0
30/07/2007
Jax
Remove o separador de milhares.
Só que o problema geralmente não é o separador de milhares porque na maioria das vezes o separador de milhares não é utilizado.
Mas e quando o separador decimal for ponto e vc passar uma virgua?
Ou vice-versa?
Uma solução possível:
function MeuStrToFloat(Str : string; Def : Double = 0) : Double; var Ch : Char; begin Ch := DecimalSeparator; try DecimalSeparator := ´,´; Result := StrtToFloatDef(Trim(Str), Def); finally DecimalSeparator := Ch; end; end;
É claro que vc tem que ter certeza de que sempre o separador decimal vai ser a virgula nesse caso.
Desculpen qualquer coisa.
Espero ter colaborado.
Gostei + 0
30/07/2007
Jax
StrtToFloatDef ----> StrToFloatDef
Gostei + 0
31/07/2007
Jpauloss
function MeuStrToFloat(Str : string; Def : Double = 0) : Double; var Ch : Char; begin Ch := DecimalSeparator; try DecimalSeparator := ´,´; Result := StrtToFloatDef(Trim(Str), Def); finally DecimalSeparator := Ch; end; end;
Vou dispara essa function aonde?
Gostei + 0
31/07/2007
Jpauloss
----------------------------------------------------------------------------------
unit U_DM;
interface
uses
SysUtils, Classes, DBXpress, FMTBcd, Provider, DBClient, DB, SqlExpr, SimpleDS;
type
.....
private
{ Private declarations }
public
{ Public declarations }
function MeuStrtoFloat : Double;
end;
var
DM: TDM;
implementation
{$R *.dfm}
function MeuStrToFloat(Str : string; Def : Double = 0) : Double;
var
Ch : Char;
begin
Ch := DecimalSeparator;
try
DecimalSeparator := ´,´;
Result := StrToFloatDef(Trim(Str), Def);
finally
DecimalSeparator := Ch;
end;
end;
end.
-----------------------------------------------------------------------------------
Está dando erro na criação dessa function.
Erro:
[Pascal Error] U_DM.pas(43): E2065 Unsatisfied forward or external declaration: ´TDM.MeuStrtoFloat´
Esse erro é da linha:
function MeuStrtoFloat : Double;
-----------------------------------------------------------------------------------
Gostei + 0
01/08/2007
Ricardo_ascii
variavel:=dm.query1.fieldbyname(´valor´).value;
Gostei + 0
01/08/2007
Emerson Nascimento
você tem duas formas de resolver o problema:
1. retire a [i:bc376650bc]declaração da função*[/i:bc376650bc] da seção [i:bc376650bc]public[/i:bc376650bc] e a coloque imediatamente antes de [i:bc376650bc]implementation[/i:bc376650bc] ou
2. na implementação da função altere o cabeçalho para
function [b:bc376650bc]TDM.[/b:bc376650bc]MeuStrToFloat(Str : string; Def : Double = 0) : Double;
type TDM = class( ... )
.....
private
{Private declarations}
public
{Public declarations}
function MeuStrToFloat(Str : string; Def : Double = 0) : Double;
end;
var
DM: TDM;
implementation
{$R *.dfm}
function TDM.MeuStrToFloat(Str : string; Def : Double = 0) : Double;
var
Ch : Char;
begin
Ch := DecimalSeparator;
try
DecimalSeparator := ´,´;
Result := StrToFloatDef(Trim(Str), Def);
finally
DecimalSeparator := Ch;
end;
end;
end.* a declaração da função estava errada. o cabeçalho tem que ficar igual aquele da implementação.
Gostei + 0
01/08/2007
Jpauloss
type TDM = class( ... )
.....
private
{Private declarations}
public
{Public declarations}
function MeuStrToFloat(Str : string; Def : Double = 0) : Double;
end;
var
DM: TDM;
implementation
{$R *.dfm}
function TDM.MeuStrToFloat(Str : string; Def : Double = 0) : Double;
var
Ch : Char;
begin
Ch := DecimalSeparator;
try
DecimalSeparator := ´,´;
Result := StrToFloatDef(Trim(Str), Def);
finally
DecimalSeparator := Ch;
end;
end;
end.Aonde vou disparar essa function? No evento onexit do edit em questão?
Outra coisa como vou fazer para chamar essa function em outro form?
Gostei + 0
02/08/2007
Jáder Medeiros
[b:e2c0e1e432]Sugiro no evento OnSetText do Field.[/b:e2c0e1e432]
[b:e2c0e1e432]Para chamar a função em outro Form, basta você invocar como:[/b:e2c0e1e432]
DM.MeuStrToFloat
Lembrando que a variável DM deve ter um objeto instanciado.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)