Converter valores como 10.80 para 10,80
Galera eu tenho uma Query onde eu tenho um field do tipo String que me retorna o seguinte valor: 10.80, mas eu preciso transformar esse valor em Asfloat, ou seja, em 10,80.
Já tentei StrToFloat mas dar erro: is not a valid floating point value.
também tentei StrToFloatDef(QryTotais.FieldByName(total).AsString,0) mas ele retorna sempre 0(zero)
Alguem pode me ajudar
Já tentei StrToFloat mas dar erro: is not a valid floating point value.
também tentei StrToFloatDef(QryTotais.FieldByName(total).AsString,0) mas ele retorna sempre 0(zero)
Alguem pode me ajudar
Sidney Abreu
Curtidas 0
Respostas
Marco Salles
24/05/2012
muitas formas , mas todas vão depender de fato da conscistencia dos seu dados
try
valor:=StrToFloat(StringReplace(SeuDataSet.FieldByName(SeuCampo).AsString,.,DecimalSeparator,[]));
Showmessage(floattostr(Valor));
except
//
end;
try
valor:=StrToFloat(StringReplace(SeuDataSet.FieldByName(SeuCampo).AsString,.,DecimalSeparator,[]));
Showmessage(floattostr(Valor));
except
//
end;
GOSTEI 0
Marco Salles
24/05/2012
consistência ...
GOSTEI 0
Joel Rodrigues
24/05/2012
Cara, dependendo do banco que você usa, talvez possa ser melhor já trazer o valor convertido do BD. Em SQL Server, por exemplo, você pode usar a função CAST. Assim, no Delphi, você usaria o campo como AsFloat.
GOSTEI 0
Marco Salles
24/05/2012
Tem o Cast , mas se os dados ja estiverem em memoria não é necessário fazer nova requisição ao Banco
é so tratar os dados. Existe tb o evento OngetField
é so tratar os dados. Existe tb o evento OngetField
GOSTEI 0
Joel Rodrigues
24/05/2012
Claro, é verdade, estando os dados em memória, o mais adequado é tratar via código no Delphi. Porém, se for possível já trazer os dados do banco convertidos, você transfere a responsabilidade do processamento da conversão para o banco, poupa algumas linhas de código e, consequentemente, memória da máquina que está executando sua aplicação.
GOSTEI 0
Sidney Abreu
24/05/2012
Galera tentei usar o Cast mas ele não converte, o banco é o SQlite eu estou usando o Zeos no delphi. é uma aplicação que eu fiz para o android e o meu select é esse:
select distinct
produtos.Prod_Descricao,
itens.preco,
sum(itens.qtde) as Qtde,
itens.desconto,
itens.preco * cast(sum(itens.qtde) as float) as total
from
itens
inner join pedidos on (pedidos.numero = itens.numero)
inner join produtos on (produtos.Prod_id = itens.prod_id)
where
pedidos.data_cad = 23/05/2012
group by
produtos.Prod_Descricao
order by
produtos.Prod_Descricao
select distinct
produtos.Prod_Descricao,
itens.preco,
sum(itens.qtde) as Qtde,
itens.desconto,
itens.preco * cast(sum(itens.qtde) as float) as total
from
itens
inner join pedidos on (pedidos.numero = itens.numero)
inner join produtos on (produtos.Prod_id = itens.prod_id)
where
pedidos.data_cad = 23/05/2012
group by
produtos.Prod_Descricao
order by
produtos.Prod_Descricao
GOSTEI 0
Joel Rodrigues
24/05/2012
E as conversões citadas pelo marco, já tentou?
GOSTEI 0
Marco Salles
24/05/2012
E as conversões citadas pelo marco, já tentou?
.Outra opção (não sei se o banco dele suporta ) é fazer um StringReplace no proprio Sql retornando
no lugar do Ponto o DecimalSeparator
Não manjo quase nada de Sql mas ja vi muitas coisas do genero
GOSTEI 0
Sidney Abreu
24/05/2012
Só consegui resolver no braço mesmo, criei uma tabela com o nome Cast com os campos nos tipo de dados que eu precisava e fiz um select. fica ai a dica pra quem for usar o Sqlite integrado ao delphi.
select
Prod_Descricao ,
preco ,
Qtde ,
desconto ,
total
from tabela_cast
union
select distinct
produtos.Prod_Descricao as Prod_Descricao,
itens.preco,
sum(itens.qtde) as Qtde,
itens.desconto,
itens.preco * sum(itens.qtde) as total
from
itens
inner join pedidos on (pedidos.numero = itens.numero)
inner join produtos on (produtos.Prod_id = itens.prod_id)
where
pedidos.data_cad = 23/05/2012
group by
produtos.Prod_Descricao
order by
produtos.Prod_Descricao
GOSTEI 0
Joel Rodrigues
24/05/2012
Que bom que você conseguiu resolver. Obrigado por compartilhar a solução.
GOSTEI 0
Marco Salles
24/05/2012
muitas formas , mas todas vão depender de fato da conscistencia dos seu dados
try
valor:=StrToFloat(StringReplace(SeuDataSet.FieldByName(SeuCampo).AsString,.,DecimalSeparator,[]));
Showmessage(floattostr(Valor));
except
//
end;
try
valor:=StrToFloat(StringReplace(SeuDataSet.FieldByName(SeuCampo).AsString,.,DecimalSeparator,[]));
Showmessage(floattostr(Valor));
except
//
end;
Joel esta conversão da certo tb , o unico problema é o Forum que come as aspas simpes e a formatação de nossas
respostas ... A Questão é se quer converter 10.80 para float tem que transformar o ponto para o decimal separator
padrão que é o ponto e virgula . Ou tb transformar o contrário , isto é o Decimal separator para o Ponto
descimalseparator:=. ;
GOSTEI 0
Marco Salles
24/05/2012
muitas formas , mas todas vão depender de fato da consistencia dos seu dados
try
valor:=StrToFloat(StringReplace(SeuDataSet.FieldByName(SeuCampo).AsString,.,DecimalSeparator,[]));
Showmessage(floattostr(Valor));
except
//
end;
try
valor:=StrToFloat(StringReplace(SeuDataSet.FieldByName(SeuCampo).AsString,.,DecimalSeparator,[]));
Showmessage(floattostr(Valor));
except
//
end;
Joel esta conversão da certo tb , o unico problema é o Forum come as aspas simples e a formatação de nossas
respostas ... A Questão é : se quer converter 10.80 para float tem que transformar o ponto para o decimal separator
que por padrão é a virgula . Ou pode-se tb transformar o contrário , isto é o Decimal separator para o Ponto
descimalseparator:=. ;
Assim o delphi passa a aceitar 10.80 como numero
GOSTEI 0