Converter valores como 10.80 para 10,80

Delphi

24/05/2012

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
Sidney Abreu

Sidney Abreu

Curtidas 0

Respostas

Marco Salles

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;
GOSTEI 0
Marco Salles

Marco Salles

24/05/2012

consistência ...
GOSTEI 0
Joel Rodrigues

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

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
GOSTEI 0
Joel Rodrigues

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

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
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

24/05/2012

E as conversões citadas pelo marco, já tentou?
GOSTEI 0
Marco Salles

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

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

Joel Rodrigues

24/05/2012

Que bom que você conseguiu resolver. Obrigado por compartilhar a solução.
GOSTEI 0
Marco Salles

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;


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

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;


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
POSTAR