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

Módulo 11


Evandro Fontes

Pergunta

Fala galera,

Tive que usar o cálculo do módulo 11 p/ encontrar o digito verificador de uma inscrição. Procurei se já tinha sido feito e não encontrei o que precisava, então criei uma função p/ isso, seguindo os cálculos apresentados na página da wikipedia ( http://pt.wikipedia.org/wiki/Dígito_verificador ).

Gostaria de saber se alguém tem alguma forma mais simples de fazer esse cálculo, ou se consegue melhorar a função.

Segue função que desenvolvi:

function mod11($numero = ""){
    if($str = strlen($numero) < 6) return '';
    $str = strlen($numero);
    $cont = 7;
    for($i = 0; $i < $str; $i++){
        $arr_str[] = substr($numero, $i, 1);
    }
    
    foreach($arr_str as $digito){
        $result[] = $digito*$cont;
        $cont--;
    }
    
    $total = floatval( (array_sum($result)*10)/11);
    $digito        = explode(".", $total);
    $seg_num    = substr($digito[1], 1, 1);
    
    if($seg_num < 5){
        $dv = ($seg_num >0)? (substr($digito[1], 0, 1))+1 : '0';
    }else{
        $digito = explode(".", round($total, 1));
        $dv = (!$digito[1] || $digito[1] <= 9 )?$digito[1] : '0';
    }
    
    return $dv;
}

falou!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Segue função, retirada do boletophp que contem o modulo 11

veja se ajuda

function modulo_11($num, $base=9, $r=0) {

/**

* Autor:

* Pablo Costa <pablo@users.sourceforge.net>

*

* Função:

* Calculo do Modulo 11 para geracao do digito verificador

* de boletos bancarios conforme documentos obtidos

* da Febraban - www.febraban.org.br

*

* Entrada:

* $num: string numérica para a qual se deseja calcularo digito verificador;

* $base: valor maximo de multiplicacao [2-$base]

* $r: quando especificado um devolve somente o resto

*

* Saída:

* Retorna o Digito verificador.

*

* Observações:

* - Script desenvolvido sem nenhum reaproveitamento de código pré existente.

* - Assume-se que a verificação do formato das variáveis de entrada é feita antes da execução deste script.

*/

$soma = 0;

$fator = 2;

/* Separacao dos numeros */

for ($i = strlen($num); $i > 0; $i--) {

// pega cada numero isoladamente

$numeros[$i] = substr($num,$i-1,1);

// Efetua multiplicacao do numero pelo falor

$parcial[$i] = $numeros[$i] * $fator;

// Soma dos digitos

$soma += $parcial[$i];

if ($fator == $base) {

// restaura fator de multiplicacao para 2

$fator = 1;

}

$fator++;

}

/* Calculo do modulo 11 */

if ($r == 0) {

$soma *= 10;

$digito = $soma % 11;

if ($digito == 10) {

$digito = 0;

}

return $digito;

} elseif ($r == 1){

$resto = $soma % 11;

return $resto;

}

}

Link para o comentário
Compartilhar em outros sites

  • 0

Realmente essa função está mais otimizada que a que eu criei....

Eu procurei alguma forma na net de como pegar o resto da divisão direto, mas como não tinha muito tempo hábil, fiz na raça mesmo... agora sei que o ( % ) faz isso.. hehheeh

Valeu. Vou ver se consigo fazer algo na função p/ melhorar, mas essa do boletophp está muito enxuta...

Obrigado jissa!

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.1k
    • Posts
      651.8k
×
×
  • Criar Novo...