none
função Modulo 11 personalizada: Delphi ==> C# RRS feed

  • Discussão Geral

  • Olá

    Tenho uma função em Delphi que retorna o DV de qualquer boleto de cobrança corretamente.

    Agora estou necessitando dessa mesma função, só que para uma aplicação em C#.

    Achei algumas funções de Modulo 11 genéricas na internet, mas todas retornam o DV errado (outro número).

    Não sou muito familiarizado com a sintaxe de funções específicas do C#, sendo assim, alguém por favor, poderia me ajudar

    traduzindo essa função abaixo para C#?

    Segue =>

    function Modulo11LinhaDigitavel(Valor: String; Base: Integer = 9; Resto : boolean = false) : string;
    var
       Soma : integer;
       Contador, Peso, Digito : integer;
       I: integer;
    begin
      for I := 1 to Length(Valor) do
      begin
        if Pos(Valor[I], '0123456789')=0 then
        begin
          Delete(Valor, I, 1);
        end;
      end;
    
      Valor := Copy(Valor, 1, 4) +
               Copy(Valor, 33,15) +
               Copy(Valor, 5,5) +
               Copy(Valor, 11,10) +
               Copy(Valor, 22,10);
    
      Valor := Copy(Valor, 1, 4) + Copy(Valor, 6, 39);
    
      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;
      // correção
      if Result = '0' then Result := '1';
    end;


    • Editado FLASHCODER terça-feira, 26 de abril de 2016 18:00
    • Tipo Alterado Marcos SJ terça-feira, 26 de abril de 2016 19:21 How to
    terça-feira, 26 de abril de 2016 17:58

Todas as Respostas

  • Estou tentando, fazendo aqui uma tradução, quando terminar, postarei para saber possíveis erros de lógica com vocês aqui! :D
    terça-feira, 26 de abril de 2016 21:23
  • Estou tentando, fazendo aqui uma tradução, quando terminar, postarei para saber possíveis erros de lógica com vocês aqui! :D

    Ta aqui pessoal, só que ta dando erro, mas pelo menos tentei :D

    Se alguém aqui quiser ajudar a solucionar, a ajuda será muito bem vinda!

    /// <summary> /// Remove a primeira ocorrência da substring em uma string completa /// </summary> /// <param name="source">String completa</param> /// <param name="remove">String para ser removida</param> /// <returns>Retorna a nova string sem os caracteres que foram retirados</returns> public static string RemoveFirst(this string source, string remove) { int index = source.IndexOf(remove); return (index < 0) ? source : source.Remove(index, remove.Length); } /// <summary> /// Valida o dígito verificador da linha /// </summary> /// <param name="Valor">Linha Digitável</param>

    /// <param name="Base"></param>

    /// <param name="Resto"></param> /// <returns>Retorna o dígito verificador correspondente a linha digitável avaliada</returns> public static string Modulo11LinhaDigitavel(string Valor, int Base = 9, bool Resto = false) { int peso = 2; int soma = 0; int contador, digito, i; string retorno = ""; for (i = 1; i <= Valor.Length; i++) { int pos = Valor[i].ToString().IndexOf("0123456789"); if (pos < 0) RemoveFirst(Valor, Valor[i].ToString()); } Valor = Valor.Substring(0, 4) + // 1 e 4 Valor.Substring(32, 15) + // 33 e 15 Valor.Substring(4, 5) + // 5 e 5 Valor.Substring(10, 10) + // 11 e 10 Valor.Substring(21, 10); // 22 e 10 // 1 e 4 // 6 e 39 Valor = Valor.Substring(0, 4) + Valor.Substring(5, 39); for (contador = Valor.Length; contador >= 0; contador--) { soma = soma + (Convert.ToInt32(Valor[contador]) * peso); if (peso < Base) { peso = peso + 1; } else { peso = 2; } } if (Resto) { retorno = (soma % 11).ToString(); return retorno; } else { digito = 11 - (soma % 11); if (digito > 9) { digito = 0; retorno = digito.ToString(); return retorno; } } if (retorno == "0") { retorno = "1"; } return retorno; }

    // Uma vez funcionado, teria que retornar 5, que é o DV da linha digitável abaixo em questão

      static void Main(string[] args)
            {

                Console.WriteLine(Modulo11LinhaDigitavel("10490.05539 03698.700006 00091.449587 5 55490000028531"));
                Console.ReadKey();

            }




    • Editado FLASHCODER terça-feira, 26 de abril de 2016 22:12
    terça-feira, 26 de abril de 2016 22:07