Inquiridor
função Modulo 11 personalizada: Delphi ==> C#

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
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
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