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

Criar função True para iguais e False para diferentes


Thiago lrd

Pergunta

Boa tarde galera!

Meu primeiro post e já gostaria de uma ajuda. Estou trabalhando em um projeto cujo o fundamento é validar DANFE ou seja 44 caracteres sendo dois deles o DV. Pois bem o proposito foi feito porem estou tentando melhorar usando a função RETURN True para chaves que tenha DV identico ao que foi calculado, bem como o retorn False para DV diferentes da chave digitadas. Como deveria ficar?

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

nesse exemplo se o calculo da raiz quadrada for diferente de zero sera true, caso contrario sera false

def prime2(n):
    n = eval(input("What is your number? "))
    for i in range(2, int(math.sqrt(n)) + 1):

        if n % i == 0:
            return False
        else:
            return True

se quiser incrementar o DANFE veja

http://nullege.com/codes/show/src@p@y@PySP...danferetrato.py

veja tambem essa apostila, pode ajuda-lo a enteder melhor a função

http://docs.python.org/2/library/stdtypes.html

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

O Jhonas obrigado mesmo pela ajuda, mais creio que ainda não é isso. Bom para esbolçar melhor meu projeto vou descreve-lo.

danfe = '31060243816719000108550000000010001234567897'

def caldig1(danfe):
    soma = 0
    for i in range(42):
        soma = soma + (int(danfe[i]) * (44 - i))
    resto = soma % 11
    if resto == 0 or resto == 1:
          dver = 0
    else:
          dver = 11 - resto  
       return dver 

def caldig2(danfe,dv1):
    soma = 0
    for i in range(43):
        soma = soma + (int(danfe[i]) * (42 - i)) 
    soma = soma + dv1 * 2
    resto = soma % 11
    if resto == 0 or resto == 1:
        dver = 0 
    else:
        dver = 11 -resto
    return dver

print caldig1(danfe) 
print caldig2(danfe,caldig1(danfe))

Lembrando que a primeira linha é a DANFE que estou testando, quando executamos o script podemos verificar que é impresso exatamente os dois DVs. Agora é a parte que estou tentando incrementar, o que estou tentando fazer é criar a função de retorno no script para quando od DVs forem iguais ao calculado retorne TRUE e quando forem diferentes retornem FALSE.

Editado por Thiago lrd
Link para o comentário
Compartilhar em outros sites

  • 0

faça uma analogia do seu codigo com esse para resolver o problema

1. String gerarChaveDeAcessoNfe(String chaveSemDigito) throws InputMismatchException {  
   2.           
   3.         // UMA CHAVE DE ACESSO DE NF-E TEM 44 DIGITOS, então O CALCULO SE DÁ COM OS 43 ANTERIORES  
   4.         if (chaveSemDigito.length() != 43) {   
   5.             throw new InputMismatchException("Chave Invalida possui " + chaveSemDigito.length());  
   6.         }  
   7.         int[] aux = new int[chaveSemDigito.length()];  
   8.         int variavel = 2;  
   9.         int total = 0;  
  10.         int dv = 0;  
  11.         for (int i = aux.length - 1; i >= 0; i--) {  
  12.             aux[i] = Integer.parseInt("" + chaveSemDigito.charAt(i));  
  13.             aux[i] = aux[i] * variavel;  
  14.             variavel++;  
  15.             if (variavel > 9)  
  16.                 variavel = 2;  
  17.             total += aux[i];  
  18.         }  
  19.           
  20.         if (total == 0 || total == 1)  
  21.             dv = 0;  
  22.         else  
  23.             dv = 11 - (total % 11);  
  24.           
  25.   
  26.         String chaveFinal = (chaveSemDigito + dv);  
  27.         System.out.println("Digito Verificador: " + dv);  
  28.         System.out.println("chave FInal: " + chaveFinal);  
  29.         return chaveFinal;  
  30.   
  31. }

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

não é python o codigo, mas voce vai aproveitar a logica desse código para aplicar ao seu ... entendeu ?

exemplo

seu código

if resto == 0 or resto == 1:
        dver = 0
    else:
        dver = 11 -resto
    return dver
o outro
if (total == 0 || total == 1)  
            dv = 0;  
         else  
            dv = 11 - (total % 11);

percebeu que os 2 fazem a mesma coisa ?

se voce seguir esse raciocinio, bastara fazer as moficações usando o python para que funcione corretamente o seu código

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

não tenho o python instalado, mas fiz algo em delphi para demonstrar o uso da variavel boleana ( true or false )

function Modulo11(Valor: string; Base: Integer = 9; Resto: Boolean = False): string;
{
  Rotina muito usada para calcular dígitos verificadores
  Pega-se cada um dos dígitos contidos no parâmetro VALOR, da direita para a
  esquerda e multiplica-se pela seqüência de pesos 2, 3, 4 ... até BASE.
  Por exemplo: se a base for 9, os pesos serão 2,3,4,5,6,7,8,9,2,3,4,5...
  Se a base for 7, os pesos serão 2,3,4,5,6,7,2,3,4...
  Soma-se cada um dos subprodutos.
  Divide-se a soma por 11.
  Faz-se a operação 11-Resto da divisão e devolve-se o resultado dessa operação
  como resultado da função Modulo11.
  Obs.: Caso o resultado seja maior que 9, deverá ser substituído por 0 (ZERO).
}
var
  Soma, Contador, Peso, Digito: Integer;
begin
  Soma := 0;
  Peso := 2;

  for Contador := Length(Valor) downto 1 do
  begin
    Soma := Soma + (StrToInt(Valor[Contador]) * Peso);
    if Peso < Base then
      Peso := Peso + 1 else
      Peso := 2;
  end;

  if Resto then
    Result := IntToStr(Soma mod 11)
  else
  begin
    Digito := 11 - (Soma mod 11);
    if (Digito > 9) then
      Digito := 0;
    Result := IntToStr(Digito);
  end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var s, s1, danfe : string; Resto: Boolean;
begin
   danfe :=  '31060243816719000108550000000010001234567897';

   s  := Modulo11(danfe,0,false);

   // compara o resultado do modulo 11 com o digito verificador da danfe
   if copy(danfe,length(danfe),1) = s then
      resto := true
   else
      resto := false;

end;

abraço

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,3k
×
×
  • Criar Novo...