Somar ponto flutuante

07/06/2008

0

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;


Cleiflavio

Cleiflavio

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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar