Ir para conteúdo
Fórum Script Brasil
  • 0

FormatFloat depois tirar formatação pra salvar


flavioavilela

Pergunta

galera, é o seguinte: estou usando o formatfloat pra formatar uns campos que tenho aqui.... beleza... eu digito um número, pressiono enter e funciona beleza.... formata como eu quero.... só que, quando eu vou salvar, eu preciso tirar a formatação, pois o bd não aceita (meu bd é o sqlserver)... só que, por exemplo, quando eu mando tirar a formatação pra salvar, por exemplo que em uma caixa texto eu digitei 5, pressionei enter ele faz 5,00... quando eu tiro a formatação pra salvar, ele salva como 500(quinhentos)... ai, quando eu utilizo esses números pra fazer umas contas aqui, ele entendi que é 500 e não 5............... o que fazer neste caso??????

para tirar a formatação estou utilizando StringReplace(Edit1.text, '.', '', [rfReplaceAll]) e StringReplace(Edit1.text, ',','', [rfReplaceAll])............. removo a , e o . .....

alguém pode me dar uma luz nisso ai?????

Link para o comentário
Compartilhar em outros sites

15 respostass a esta questão

Posts Recomendados

  • 0
... só que, por exemplo, quando eu mando tirar a formatação pra salvar, por exemplo que em uma caixa texto eu digitei 5, pressionei enter ele faz 5,00... quando eu tiro a formatação pra salvar, ele salva como 500(quinhentos)... ai, quando eu utilizo esses números pra fazer umas contas aqui, ele entendi que é 500 e não 5............... o que fazer neste caso??????

flavioavilela, voce não pode simplesmente retirar a formatação. Voce tem que ajustá-la!

Se você chegou a ler os posts que citei como referência no seu outro tópico, você deveria ter percebido que temos a questão a inversão dos separadores de milhar e decimais e, provavelmente, você teria observado que para fazer a conversão correta - neste seu exemplo - teria que tentar converter o texto no formato 5.0 e não 5,0. Assim, o sensato seria usar as funções para realizar esta substituição não supressão.

StringReplace(Edit1.text, ',', '.', [rfReplaceAll]) - isto troca a vírgula por ponto. O que resolve um problema, não outro.

Caso você tenha um valor 1.052,50 e use a função como acima, o resultado será: 1.052.50; o que também não poderá ser corretamente convertido, porque há dois separadores de decimais e evidentemente isto é impossível.

Então, já sabemos que será necessário remover qualquer outra pontuação que não seja a de decimal - só ela deverá existir antes da conversão.

Com isto em mente, começamos por tentar remover qualquer caracter ponto (.) que exista na sua string, já que estará denotando milhares (não decimal):

Edit1.text := StringReplace(Edit1.text, '.','', [rfReplaceAll]) - isto resulta em um texto numérico que não tem separador de milhar - o exemplo ficaria: 1052,50

e terminamos por tentar trocar o separador de decimal do formato texto (a vírgula) para delimitador de decimal na notação numérica - padrão americano:

Edit1.text := StringReplace(Edit1.text, ',', '.', [rfReplaceAll]) - isto resulta em um texto numérico onde o separador de decimal passa a ser o ponto - o exemplo agora passaria a 1052.50, que será corretamente convertido.

Agora é só converter: StrToFloat(Edit1.text);

Para ficar 100%, não deveríamos utilizar fixo os caracteres ',' e '.' nas funções, porque os delimitadores são dependentes da linguagem, mas como acredito que a maioria não tem programa exportado para outros países, não vou entrar no mérito da coisa.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

certo... entendi perfeitamente... só que, ao trocar o ponto por nada e virgula por ponto, por exemplo, eu digitei o número 25 em uma caixa texto, dei enter ficou 25,00.... antes de salvar, eu tiro a formatação, como você me explicou... ai fica 25.00... ai mando salvar... ai da erro no bd, falando que não é um ponto flutuante correto... e se eu tirar a formatação por completa, como já disse, fica 2500 (dois mil e quinhentos) ai da zebra...... meu bd e sqlserver e o campo no bd está configurado como Numeric(15,2)... já tentei por float e também não funfou............ o que fazer???

Link para o comentário
Compartilhar em outros sites

  • 0

certo.... então, abaixo segue o código que estou fazendo a conversão:

procedure TFrmVendas_Balcao.EdtSub_TotalKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  var
    strv, strq, strs: string;
begin
  if (Key = VK_Return) then
    begin
      with DM.SPItens_Venda_Balcao do
          begin
            try
              Params[1].AsInteger:= 1;
              Params[2].AsInteger:= StrToInt(EdtCodigo_Registro.Text);
              Params[3].AsInteger:= StrToInt(EdtN_Pedido.Text);
              Params[4].AsString:= EdtCodigo.Text;
              Params[5].AsString:= EdtNome.Text;

              Strv:= StringReplace(EdtValor_Venda.Text, '.','', [rfReplaceAll]);
              Strv:= StringReplace(Strv, ',', '.', [rfReplaceAll]);
              Params[6].AsFloat:= StrtoFloat(strv);

              Params[7].AsFloat:= StrtoFloat(EdtDesconto.Text);

              Strq:= StringReplace(EdtQuantidade.Text, '.','', [rfReplaceAll]);
              Strq:= StringReplace(Strq, ',', '.', [rfReplaceAll]);
              Params[8].AsFloat:= StrtoFloat(strq);

              Strs:= StringReplace(EdtSub_Total.Text, '.', '', [rfReplaceAll]);
              Strs:= StringReplace(strs, ',', '.', [rfReplaceAll]);
              Params[9].AsFloat:= StrtoFloat(strs);

              ExecProc;
              DM.qry_itensbalcao.Close;
              DM.qry_itensbalcao.SQL.Clear;
              DM.qry_itensbalcao.SQL.Add ('select * from Itens_Venda_Balcao where N_Pedido = '+ EdtN_Pedido.Text);
              dm.qry_itensbalcao.RequestLive:= true;
              DM.qry_itensbalcao.Open;
              Application.MessageBox('Produtos inseridos com sucesso.', 'Inclusão realizada com sucesso', MB_ICONQUESTION+MB_OK);

              TlbBtnRemover_Produtos.Enabled:= true;
              TlbBtnAtualizar_Estoque.Enabled:= true;
              BBtnSalvar.Enabled:= true;

              EdtCodigo.Clear;
              EdtNome.Clear;
              EdtQuantidade.Clear;
              EdtDesconto.Clear;
              EdtValor_Venda.Clear;
              EdtCodigo.SetFocus;

              subtotalpecas:= StrToFloat(EdtSub_Total.Text);
              totalgeral:= StrtoFloat(EdtValor_Total.Text);
              somapecas:= subtotalpecas + totalgeral;
              EdtValor_Total.Text:= FormatFloat('##,###,##0.00', somapecas);

            except
              ShowMessage('Há dados incorretos.');
            end;
          end;
      end;
end;
e agora, a mensagem de erro em ingles. 'Project Proj.União.exe raised exception class EConvertError with message "10.20" is a not valid floating point value'....... e esse é o código que estou utilizando para poder formatar, assim que pressionar enter dentro da caixa texto...
procedure TFrmVendas_Balcao.EdtValor_VendaKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if (key = vk_return) then
    EdtValor_Venda.Text:= FormatFloat('#,##.00', StrtoFloat(EdtValor_Venda.Text));
end;

Link para o comentário
Compartilhar em outros sites

  • 0

flavioavilela, este código ao teclar ENTER, baseado no que já falamos aqui, está em risco de erro não acha?

Em que lugar (linha) é acusado o erro?

observei que nesta linha:

Params[7].AsFloat:= StrtoFloat(EdtDesconto.Text);

você ainda não tratou o campo.

obs: use a tag CODE não QUOTE para delimitar o código - Se você puder editar seu post, ele ficará mais claro.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

certo... ele da erro nas caixas texto... por exemplo, eu tenho a caixa texto valor_venda, quantidade, desconto e total.... ele da erro primeiro na valor_venda, se eu voltar lá e alterar o valor manualmente, tirando a , ou o ., ele passa o erro pra quantidade.... ai eu vou e tiro a virgula manualmente, vai pro desconto e ai vai.... ou seja, ele não aceita salvar o . ou a ,... e quando eu trato ele, tirando a , e o ., ele interpreta como sendo, por exemplo, 25,00 -> 2500... ai da zebra...

Link para o comentário
Compartilhar em outros sites

  • 0

Olah Flavio, bem estava vendo sua duvida.

Eu trabalho com SQL Server 2005, me diga como está os seus campos(valores) no SQLServer ?

E uma dica : utilize a variavel de ambiente decimalseparator,

por exemplo antes de executar sua instrução salvar você coloca decimalseparator = '.'; - ele ira substituir em tempo de execução a "," por ".", e depois de salvar colocar decimalseparator = ','.

Pois, se você deixar da forma que está irá influenciar na configuração da moeda de toda sua aplicação, pois altera o ambiente do windows.

.

Espero ajudar.

Link para o comentário
Compartilhar em outros sites

  • 0
E uma dica : utilize a variavel de ambiente decimalseparator,

por exemplo antes de executar sua instrução salvar você coloca decimalseparator = '.'; - ele ira substituir em tempo de execução a "," por ".", e depois de salvar colocar decimalseparator = ','.

Pois, se você deixar da forma que está irá influenciar na configuração da moeda de toda sua aplicação, pois altera o ambiente do windows.

Luis Ricardo, a observação é válida e eventualmente incompleta. Explico: considerando que possa ser digitado valores na casa de milhares (como 8.550,00 - se assim estiver formatado), haverá algum tipo de erro visto que existe uma outra variável, chamada ThousandSeparator, que define o separador de milhar e que na configuração de localidade retornada pelo Windows (pt-br) também será o '.' - logo, imagino que esta variável também devesse ser manipulada na situação que você propõe.

Olhando melhor a questão, e verificando a observação constante da função StrToFloat no help podemos chegar a conclusão que errei ao propor no post#3 a substituição/troca dos delimitadores.

A observação é a seguinte:

The DecimalSeparator global variable defines the character that must be used as a decimal point. Thousand separators and currency symbols are not allowed in the string.

que traduzindo...

A variável global DecimalSeparator define o caracter que deve ser usado como ponto decimal. Separador de milhares e símbolos monetários não são permitidos na string.

ou seja, a única coisa a fazer com o texto antes da conversão é: remover os separadores de milhares. Vamos repetir aqui retirando o '.' que está fixo como separador de milhar e usar a variável (vai que você resolve exportar seu programa - rsrs):

Edit1.text := StringReplace(Edit1.text, ThousandSeparator,'', [rfReplaceAll]);
Valor := StrToFloat(Edit1.Text);
flavioavilela, também vi outro erro no código abaixo - observe a máscara de formatação. Deveria ser '#,##0.00' - entre o separador de milhar e decimal, de qualquer número tem sempre 3 caracteres (algarismos):
procedure TFrmVendas_Balcao.EdtValor_VendaKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if (key = vk_return) then
    EdtValor_Venda.Text:= FormatFloat('#,##.00', StrtoFloat(EdtValor_Venda.Text));
end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

opaaaaaaaa....

tava fazendo uns testes aqui, só pra garantir...... na caixa texto valor total minha aqui, surgiu um valor como 1.250,00...... eu fiz conforme vocês disseram quanto ao ThousandSeparator e o delphi tornou a dizer que não é um valor de ponto flutuante valido....... massss, quando eu salvo só um valor sem milhar, tipo, 520,00 ai salva beleza.... entendem???? o que é isso.... não da pra entender.....

Link para o comentário
Compartilhar em outros sites

  • 0
tava fazendo uns testes aqui, só pra garantir...... na caixa texto valor total minha aqui, surgiu um valor como 1.250,00...... eu fiz conforme vocês disseram quanto ao ThousandSeparator e o delphi tornou a dizer que não é um valor de ponto flutuante valido....... massss, quando eu salvo só um valor sem milhar, tipo, 520,00 ai salva beleza.... entendem???? o que é isso.... não da pra entender.....
você utilizou a última sugestão que fiz no post#10. Isto que você disse que ocorreu, parece muito com o que comentei naquele post em relação a sugestão do colega Luis Ricardo. Leia ele de novo e qualquer coisa, poste o código aqui para vermos como ele está agora.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...