Somar ponto flutuante

07/06/2008

2

Ola Galera, sou novo no Delphi e tenho um problema que está me incomodando.

tenho 3 edits (valor, valor1, valor2) então to fazendo a soma deles e jogando o valor lá no meu edit valortotal, blz, eu consigo somar valores assim 1000,00(valor) + 1000,00 (valor1) + 1000,00(valor2) = R$ 3.000,00.

Mas o problema quando eu faço uma soma assim

1.000,00 + 1.000,00 ai ele da um erro assim
(´ Is Not A Validad Floating point Value ´)
Pelo que entendi ele não consegue somar o pont (´.´).

A Pergunta é , Como eu faço para fazer ele somar com o ponto.
Segue o meu codigo

procedure TF_solicitacao.valor2Exit(Sender: TObject);
begin
somatotal:= strtofloat(valor.text) + strtofloat(valor1.text) + strtofloat(valor2.text);
valortotal.Text:= FloatToStr(Somatotal);
valortotal.text:= formatfloat(´R$ #,0.00´, somatotal);
end;


Responder

Posts

07/06/2008

Edilcimar

Isto tem a ver com a formatação numérica dentro do próprio windows, se estiver o ponto decimal com vírgula ou com ponto.


Responder

08/06/2008

Essistemas

Meu amigo eu uso a essa função para limpar o ponto ,
antes de converter

function LimparString(Campo: string): string;
var
I: Integer;
begin
Result := ´´; for I := 1 to Length(Campo)do
if Campo[I] <> ´.´ then
Result := Result + Campo[I];
end;


Function QSCURR(parString:String):Double;
begin
Result:=StrToCurr(LimparString(parString));
end;

Table1Valor.Value :=QsCurr(Edit1.Text) ;


Responder

09/06/2008

Cleiflavio

Emerson, não está dando certo,

eu estou declarando as duas funções e chamando lá na minha saido do edit mas ele dá esse erro


´Record, obeject or class type required´

a não ser se eu estiver declarando errado porque não entedi direito oq vc fez na ultima linha

Table1Valor.Value :=QsCurr(Edit1.Text) ;

minha declaração é essa ==>> valor.text.value := QsCurr(valor.text);
eu acredito que eu esteje declarando errado

segu meu codigo novamente:

function LimparString(Campo: string): string;
var
I: Integer;
begin
Result := ´´; for I := 1 to Length(Campo)do
if Campo[I] <> ´.´ then
Result := Result + Campo[I];
end;


Function QSCURR(parString:String):Double;
begin
Result:=StrToCurr(LimparString(parString));
end;




procedure TF_solicitacao.valorExit(Sender: TObject);
begin

//Table1Valor.Value :=QsCurr(Edit1.Text) ;

valor.text.value := QsCurr(valor.text);

somatotal:= strToFloat(valor.text);
valortotal.Text:= floatToStr(Somatotal);
valortotal.text:= formatfloat(´R$ #,0.00´, somatotal);

end;

Clei Flavio


Responder

09/06/2008

Essistemas

eu tenho uma UNIT com as funções que utlizo, ai declaro essa UNIT
no uses do meu form e pronto
ex:
unit UFuncServidor;

interface
Uses
Windows, Messages, SysUtils,Controls, Classes, ComServ, ComObj, VCLCom, DataBkr,
DBClient, DBXpress, FMTBcd, Provider, DB, SqlExpr,Dialogs,
Variants ;
Function FloatToStrSQL(Const lValue:Extended; Const lDigits:Integer):String;
Function QS(parSQL:String):String;
Function QSF(parFLOAT:Double):String;
Function QSD(parDATA:TDateTime):String;
function CHECK_NOT_NULL(var par_sErro:String;par_Delta:TCustomClientDataSet;par_Campo:String;par_Mensagem:String;par_UpperCase:String):String;
Function DiadaSemana( Data :TDateTime ) : String ;

implementation
Uses UDm ;

function CHECK_NOT_NULL(var par_sErro:String;par_Delta:TCustomClientDataSet;par_Campo:String;par_Mensagem:String;par_UpperCase:String):String;
Var var_sConverte : String;
Begin
var_sConverte:=par_Delta.FieldByName(par_Campo).AsString;
If( Not VarIsClear(par_Delta.FieldByName(par_Campo).NewValue) ) Then Begin
If( var_sConverte=´´ ) Then Begin
vpErro:=vpErro+Chr(13)+´ERRO:´ +par_Mensagem+´ DEVE SER PREENCHIDO ´;
Result:=vpErro;
End Else Begin
If( par_UpperCase=´S´ ) Then
par_Delta.FieldByName(par_Campo).NewValue:=UpperCase(VarToStr(par_Delta.FieldByName(par_Campo).NewValue));
end;
end;
end ;

Function DiadaSemana( Data :TDateTime ) : String ;
var
NoDia : Integer ;
DiaDaSemana : array [ 1..7 ] of String ;
begin
{ Dias da Semana }
DiaDasemana [ 1 ] := ´DOMINGO´ ;
DiaDasemana [ 2 ] := ´SEGUNDA-FEIRA´ ;
DiaDasemana [ 3 ] := ´TERÇA-FEIRA´ ;
DiaDasemana [ 4 ] := ´QUARTA-FEIRA´ ;
DiaDasemana [ 5 ] := ´QUINTA-FEIRA´ ;
DiaDasemana [ 6 ] := ´SEXTA-FEIRA´ ;
DiaDasemana [ 7 ] := ´SÁBADO´ ;
NoDia := DayOfWeek ( Data );
Result := DiaDaSemana [ NoDia ] ;
end;

Function QS(parSQL:String):String;
Begin
Result:=QuotedStr(parSQL);
end;

Function QSD(parDATA:TDateTime):String;
Begin
Result:=QuotedStr(FormatDateTime(´MM/DD/YYYY´,parDATA));
End;

Function QSF(parFLOAT:Double):String;
Begin
Result:=QuotedStr(FloatToStrSQL(parFLOAT,02));
end;

Function QSI(parINTEIRO:Integer):String;
Begin
Result:=QuotedStr(IntToStr(parINTEIRO));
end;

Function EDNE(parData:String):TDateTime;
Begin
Result:=StrToDate(parData);
End;

Function EFNE(parValor:String):Double;
Begin
If(parValor=´´) Then
parValor:=´0´;
While(Pos(´.´,ParValor)>0) Do
Delete(parValor,Pos(´.´,parValor),1);
Result:=StrToFloat(parValor);
End;

Function EINE(Text:String):Integer;
Begin
While(Pos(´.´,Text)>0) Do
Delete(Text,Pos(´.´,Text),1);
Try
Result:=StrToInt(Text);
Except
Result:=0;
End;
End;

Function FloatToStrSQL(Const lValue:Extended; Const lDigits:Integer):String;
Begin
Result:=FloatToStrF(lValue,ffFixed,15,lDigits);
Result[Length(Result)-lDigits]:=´.´;
End;

qualquer duvida estamos por aqui !


Responder

09/06/2008

Cleiflavio

Emerson, desculpe de te encher mas eu sou novo em delphi então estou aprendendo ainda,
bom eu não posso colocar essa função no meu proprio FORm

e quando eu declaro Table1Valor.Value :=QsCurr(Edit1.Text) ; lá no meu valor esse Table1Valor que eu não estou entendendo, ele é o nome da minha unit isso ????


Valeuuu, obirgado !!!!!


Responder

09/06/2008

Paulo

Se vc fizer assim, tem que funcionar
Edit3.Text := FloatToStr(StrToFloat(Edit1.Text) + StrToFloat(Edit2.Text));
. Como disse o colega Edilcimar, só depende de como está suas configurações regionais para valores numéricos. No meu caso eu fiz assim: 1000,25 + 1000,35 e o resultado foi 2000,60. Observe que não coloquei o ponto separando o milhares e coloquei vírgula como Decimal Separator(Minhas conf. regionais estão assim).


Responder

09/06/2008

Cleiflavio

Paulo,

é o seguintejá verifiquei minhas configurações e estão normais, e essa declaração sua está igual a minha e está funcionando perfeitamente quando eu coloco 1000,10 + 1000,10 ele mostra no valortotal 2.000,20, bom até ai ok, O Problema é que isso é uma solicitação e não vai ser eu quem vai preencher vão ser os usuarios e vc sabe como é usuario né, sempre vão acabar colocando 1.000,10 + 1.000,10 entendeu ai ele da esses erros que que já sitei acima, Então quero achar um jeito de quando meu edit receber o valor e converte em algo que tire o ponto e faça a soma dai ele mostra o valor convertido no valor total, spo preciso disso pois o soma já está feita.

Se puder me ajudar eu agradeço.

Obrigado


Responder

09/06/2008

Paulo

No OnKeyPress dos edits coloque para evitar o ponto:

if (key in[´.´]) then
key := #0;


Responder

09/06/2008

Cleiflavio

Paulo,

Caraa valeuuuu deu certo isso que eu precisava, Valeuuuu mesmo, mas ainda tenho um pequeno problema.

Quando eu vou somando tipo coloco lá o valor no edit depois no edit1 ai eu tenho a soma no valor total eu eu clico com o mouse no edit ele da o mesmo erro ´ is not a valid Floating point value ´ estrano só o fato de eu clicar no edit que eu já coloquei um valor ele da esse erro, vc tem alguma sugestão ??


Responder