Is not a valid floating point value
Como faz para resolver esse tipo de problema:
Is not a valid floating point value.
Is not a valid floating point value.
Jpauloss
Curtidas 0
Respostas
Jáder Medeiros
24/07/2007
Detalhe mais o que fez dar este erro.
GOSTEI 0
Jax
24/07/2007
Teste o seguinte:
O segundo parametro do StringReplace indica o caracter que está incorreto, ou seja, vc está passando uma virgula aonde deveria ser ponto por exemplo.
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
Jpauloss
24/07/2007
Teste o seguinte:
O segundo parametro do StringReplace indica o caracter que está incorreto, ou seja, vc está passando uma virgula aonde deveria ser ponto por exemplo.
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
Jax
24/07/2007
Em instruções SQL deve-se sempre usar o ponto.
já no seu aplicativo vc pode definir manualmente o separador decimal (DecimalSeparator) que desejar.
já no seu aplicativo vc pode definir manualmente o separador decimal (DecimalSeparator) que desejar.
DecimalSeparator := ´.´;
GOSTEI 0
Djjunior
24/07/2007
eu criei uma função minha do tipo:
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
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
Jax
24/07/2007
Caro Colega,
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.
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
Emerson Nascimento
24/07/2007
JAX, a função do djjunior está correta. ela está [b:23a3a2c360]retirando[/b:23a3a2c360] o separador de milhar (ThousandSeparator) da string.
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
Jax
24/07/2007
Até o momento ok.
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:
É 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.
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
Jax
24/07/2007
Deculpem, sobrou um t:
StrtToFloatDef ----> StrToFloatDef
StrtToFloatDef ----> StrToFloatDef
GOSTEI 0
Jpauloss
24/07/2007
Até o momento ok.
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:
É 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.
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
Jpauloss
24/07/2007
Estou tentando declarar na unit da dm mas ta dando um erro, não estou sabendo fazer certo. Minha unit vai aí:
----------------------------------------------------------------------------------
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;
-----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
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
Ricardo_ascii
24/07/2007
if not dm.query1.fieldbyname(´valor´).isnull then
variavel:=dm.query1.fieldbyname(´valor´).value;
variavel:=dm.query1.fieldbyname(´valor´).value;
GOSTEI 0
Emerson Nascimento
24/07/2007
o erro aconteceu porque você declarou a função como um método do form, mas não a criou assim.
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;
* a declaração da função estava errada. o cabeçalho tem que ficar igual aquele da implementação.
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
Jpauloss
24/07/2007
o erro aconteceu porque você declarou a função como um método do form, mas não a criou assim.
você tem duas formas de resolver o problema:
1. retire a [i:f29a480d0e]declaração da função*[/i:f29a480d0e] da seção [i:f29a480d0e]public[/i:f29a480d0e] e a coloque imediatamente antes de [i:f29a480d0e]implementation[/i:f29a480d0e] ou
2. na implementação da função altere o cabeçalho para
function [b:f29a480d0e]TDM.[/b:f29a480d0e]MeuStrToFloat(Str : string; Def : Double = 0) : Double;
* a declaração da função estava errada. o cabeçalho tem que ficar igual aquele da implementação.
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
Jáder Medeiros
24/07/2007
Aonde vou disparar essa function? No evento onexit do edit em questão?
[b:e2c0e1e432]Sugiro no evento OnSetText do Field.[/b:e2c0e1e432]
Outra coisa como vou fazer para chamar essa function em outro form?
[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