Ver Mensaje Individual
  #6  
Antiguo 02-12-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Reputación: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Código Delphi [-]
function Modulo97(s: string): integer;
var
  v, l : integer;
  alpha : string;
  number : longint;
begin
  v := 1;
  l := 9;
  Result := 0;
  alpha := '';

  while (v <= Length(s)) do
  begin
     if (l > Length(s)) then
        l := Length(s);
     alpha := alpha + Copy(s, v, l);
     number := StrToInt(alpha);
     Result := number mod 97;
     v := v + l;
     alpha := IntToStr(Result);
     l := 9 - Length(alpha);
  end;
end;

function ChangeAlpha(input: string): string;
var
  a : char;
begin
  /// A -> 10, B -> 11, C -> 12 ...
  Result := input;
  for a := 'A' to 'Z' do
  begin
     Result := StringReplace(Result, a, IntToStr(Ord(a) - 55), [rfReplaceAll]);
  end;
end;

function IBANValido(IBAN: string): boolean;
var
  l : integer;
begin
  Result := True;

  IBAN := UpperCase(IBAN);

  // Compruebo que sean caracteres válidos
  for l := 1 to Length(IBAN) do
     if (not (IBAN[l] in ['A'..'Z', '0'..'9'])) then
        Result := False;

  if (Result) then
  begin
     // Paso los primeros 4 digitos al final (Pais + Control)
     IBAN := IBAN + Copy(IBAN, 1, 4);
     Delete(IBAN, 1, 4);

     // Convierto letras a digitos
     iban := ChangeAlpha(IBAN);

     // Si el resto de modulo 97 es 1 es una cuenta válida
     Result := (Modulo97(IBAN) = 1);
  end;
end;

procedure Limpia_IBAN;
var
  l : integer;
  TmpIBAN : string;
begin
  while ??? do
  begin
     // Cargo variable con la IBAN que estoy recorriendo
     IBAN := ???;

     // Tomo solo los caracteres validos
     IBAN := UpperCase(IBAN);
     for l := 1 to Length(IBAN) do
        if ((IBAN[l] in ['A'..'Z', '0'..'9'])) then
           TmpIBAN := TmpIBAN + IBAN[i];
     
     if IBANValido(TmpIBAN) then
     begin
        // IBAN correcto y limpio. Actualizo el dato en la base de datos
        ???
     end
     else
     begin
        // Algo no está bien con el IBAN. Mensaje, Log, ...
        ShowMessage('Revisar: ' + IBAN);
     end;
  end;
end;
Responder Con Cita