Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 914 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Boa noite,

Uma função (TiraPontos) da acbrUtil.Strings, está retornando resultados diferentes quando compilado em aplicação VCL e Firemonkey.

- VCL -> ShowMessage(TiraPontos('1.001,00')). Isso vai mostrar 1001,00 

- Firemonkey -> ShowMessage(TiraPontos('1.001,00')). Isso vai mostrar 100100. Está eliminando o ponto, mas também a vírgula.

Analisei os fontes, mas não consegui entender porque ocorre essa situação.

Alguma sugestão?

Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Consultores
  • Solution
Postado
Em 28/05/2022 at 19:03, Valdir Dill disse:

Boa noite,

Uma função (TiraPontos) da acbrUtil.Strings, está retornando resultados diferentes quando compilado em aplicação VCL e Firemonkey.

- VCL -> ShowMessage(TiraPontos('1.001,00')). Isso vai mostrar 1001,00 

- Firemonkey -> ShowMessage(TiraPontos('1.001,00')). Isso vai mostrar 100100. Está eliminando o ponto, mas também a vírgula.

Analisei os fontes, mas não consegui entender porque ocorre essa situação.

Alguma sugestão?

Obrigado!

Oi Valdir, bom dia.

Eu testei aqui no Delphi 11 tanto VCL como FMX e no Lazarus, e em todos os casos o comportamento foi o mesmo: Foi removido tando o ponto como a vírgula. O que faz sentido, pois o código atual na unit ACBrUtil.Strings é:

function TiraPontos(const Str: string): string;
var
  i, Count: Integer;
begin
  SetLength(Result, Length(str));
  Count := 0;
  for i := 1 to Length(str) do
  begin
    if not CharInSet(str[i], [ '/',',','-','.',')','(',' ' ]) then
    begin
      inc(Count);
      Result[Count] := str[i];
    end;
  end;
  SetLength(Result, Count);
end;

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Membros Pro
Postado
35 minutos atrás, EMBarbosa disse:

Oi Valdir, bom dia.

Eu testei aqui no Delphi 11 tanto VCL como FMX e no Lazarus, e em todos os casos o comportamento foi o mesmo: Foi removido tando o ponto como a vírgula. O que faz sentido, pois o código atual na unit ACBrUtil.Strings é:

function TiraPontos(const Str: string): string;
var
  i, Count: Integer;
begin
  SetLength(Result, Length(str));
  Count := 0;
  for i := 1 to Length(str) do
  begin
    if not CharInSet(str[i], [ '/',',','-','.',')','(',' ' ]) then
    begin
      inc(Count);
      Result[Count] := str[i];
    end;
  end;
  SetLength(Result, Count);
end;

Bom dia

Analisei melhor e, realmente foi falha minha. A inconsistência não estava na função TiraPontos e sim na minha rotina. Peço desculpas.

De toda forma, acredito que seria interessante rever essa nomenclatura, pois, do jeito que está, pode induzir a erro se não olharmos o código fonte da função. "TiraPontos", no meu entender, seria uma função para tirar pontos e não tirar pontos, vírgulas, barras, espaços, ...entende?
Creio que algo como "TiraPontos_e_Outros" ficaria melhor. É apenas uma sugestão, ok?

Mas está esclarecido e resolvido.

Obrigado!

 

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Membros Pro
Postado
6 minutos atrás, Daniel Simoes disse:

Talvez esse método nem seja necessário... pois temos o método "OnlyNumber"...

Provavelmente foi adicionado após alguma doação de fontes de terceiros...

Verdade, do jeito que está, o onlyNumber já faz o trabalho.

Mas nós aqui usamos bastante essa uma função tiraPontos. Mas tem que ser somente a eliminação de pontos. Usávamos essa função do acbrUtil.strings, mas como ela não é mais apenas um "tiraPontos", criamos uma nossa.

Um exemplo prático de aplicação é a transformação de uma string em valor decimal/currency:
- VValorCurr := Strtofloat('1.001,00'); //isso dá erro
- VValorCurr := Strtofloat(MeuTiraPontos('1.001,00')); //isso não dá erro

Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

  • Consultores
Postado
3 horas atrás, Valdir Dill disse:

Um exemplo prático de aplicação é a transformação de uma string em valor decimal/currency:
- VValorCurr := Strtofloat('1.001,00'); //isso dá erro
- VValorCurr := Strtofloat(MeuTiraPontos('1.001,00')); //isso não dá erro

Obrigado!

Se o objetivo é formatar uma string numérica para float, então eu sugiro usar o strtofloat passando o segundo parâmetro. AFormatSettings.

Essa é a função específica para o problema que você apresentou. Mas é só uma sugestão.

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.