Ir para conteúdo
  • Cadastre-se

dev botao

Melhoria no método FormtarCEP


Ver Solução Respondido por Daniel Simoes,
  • Este tópico foi criado há 2958 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Conforme solicitação do Sr. Henrique Leonardo @hleorj, estou criando um novo post referente a melhoria e alterações no método "FormarCEP" sobre post 1 e post 2, onde solicitei para alterar o método para preencher com zeros a direito ao invés de zeros a esquerda. Em meus clientes ocorre o seguinte: como a maioria das pequenas cidades possui apenas 1 CEP e nos casos em que os 3 últimos dígitos é "000", eles estavam acostumados a digitar por exemplo "89140" e o método FormatarCEP formatava para "89140-000". Quando migrei os fontes para o trunk2, este método passou a formatar os zeros a esquerda, ficando "00089-140". Em Dezembro de 2015 solicitei a alteração e o @Daniel Simoes alterou para formatar os zeros a direita, conforme post 1. Porém, essa semana atualizei os fontes e novamente foi alterado para formatar zeros a esquerda, por causa da impressão do DANF-e da NF-e que trata o campo CEP como integer e ocorria problemas com CEPs iniciados com zero, conforme post 2.

Sugestão 1) Para tentar contribuir sem comprometer outras funcionalidades, sugeri a principio uma alteração na unit "ACBrValidador.pas", onde existem 2 métodos "FormtarCEP": o primeiro recebe um parâmetro string e o segundo um parâmetro integer. No método que recebe o parâmetro string, sugeri para formatar zeros a direita e no outro método que recebe o parâmetro como integer, formatar zeros a esquerda. Dessa forma não acontece o erro do post 2, porém, ao implementar um teste ( TDD ) que atenda a minha necessidade, a execução falhou no teste "FormatarMenosDeOitoDigitos". Os métodos "FormtarCEP" da unit "ACBrValidador.pas" ficariam da seguinte forma:

function FormatarCEP(const AValue: String): String;
Var S : String ;
begin
  S := PadRight( OnlyNumber(AValue), 8, '0') ; { Prenche zeros a direita }
  Result := copy(S,1,5) + '-' + copy(S,6,3) ;
end;

function FormatarCEP(const AValue: Integer): String;
Var S : String ;
begin
  S := PadLeft( OnlyNumber(IntToStr(AValue)), 8, '0') ; { Prenche zeros a esquerda }
  Result := copy(S,1,5) + '-' + copy(S,6,3) ;
end;

Sugestão 2) Uma outra sugestão, seria criar um parâmetro no método "FormatarCEP" da unit "ACBrValidador.pas" para forçar o preenchimento dos zeros a direita, mas que por padrão, caso o parâmetro não seja informado, o valor seja False. A alteração ficaria da seguinte forma:

function FormatarCEP(const AValue: String; PreencheZerosADireita: boolean = False): String;
Var S : String ;
begin
  if PreencheZerosADireita then
    S := PadRight( OnlyNumber(AValue), 8, '0')  { Prenche zeros a direita }
  else
    S := PadLeft( OnlyNumber(AValue), 8, '0') ; { Prenche zeros a esquerda }
  Result := copy(S,1,5) + '-' + copy(S,6,3) ;
end;

e o teste na unit "ACBrValidadorTest.pas" ficaria assim:

procedure TTestCaseACBrValidadorCEP.FormatarString;
var
  ACep: String;
begin
  ACep := '89140';
  CheckEquals('89140-000', ACBrValidador.FormatarCEP(ACep, True));
end;

Dessa forma, atenderia todos os testes (incluindo o teste que implementei).

Segue em anexo os arquivos referente a segunda sugestão de alteração.

 

ACBrValidador.pas

acbrvalidadortest.pas

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Fundadores
  • Solution

Não me agrada modificar a assinatura dos métodos existentes... a não ser que seja realmente necessário...

Nesse caso, preferi um código que seja capaz de detectar como o CEP deve ser alinhado, de acordo com o seu tamanho...

function FormatarCEP(const AValue: String): String;
Var
  S : String ;
begin
  S := OnlyNumber(AValue);
  if Length(S) < 5 then
    S := PadLeft( S, 5, '0');    // "9876" -> "09876"

  if Length(S) = 5 then
    S := PadRight( S, 8, '0')    // "09876" -> "09876-000"; "18270" -> "18270-000"
  else
    S := PadLeft( S, 8, '0') ;    // "9876000" -> "09876-000"

  Result := copy(S,1,5) + '-' + copy(S,6,3) ;
end;

(Já está no SVN)

  • Curtir 2
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.

The popup will be closed in 10 segundos...