Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   JAVA (https://www.clubdelphi.com/foros/forumdisplay.php?f=16)
-   -   Traducción de rutina JAVA (https://www.clubdelphi.com/foros/showthread.php?t=69076)

waly2k1 24-07-2010 04:28:04

Traducción de rutina JAVA
 
Hola muchachos, estoy desarrollando una mini aplicación en Delphi
y para ellos necesito validar un codigo de destinación que sea válido
en el momento de la carga. Existe una aplicación en Java que valida
eso, el tema es que no manejo Java y hay cosas que no entiendo. Con
lo cual posteo aquí la rutina y sin abusar de nadie me interesaría que
alguien me comente más o menos los pasos realizados. Nose
tampoco como depurar esa rutina en Java como para seguirla paso a
paso y ver lo que va realizando.

Veo que almacena en un array todos los caracteres de la cadena, pero
el valor ASCII o qué?
Luego acá k = j % 23 + 65 que hace ?
el operador %es el resto, esto sería k = (j mod 23) + 65 ???

En fin los dejo en sus manos y espero encontrar una pronta respuesta.
Desde ya muchisimas gracias por el tiempo dedicado. Abrazo!
Walter


Código:

  public static void a(String paramString)
  {
    if ((paramString == null) || (paramString.length() != 16))
      throw new b("destinacion debe tener 16 digitos");
    a(paramString, "nro de a?o", paramString.substring(0, 2));
    a(paramString, "nro de aduana", paramString.substring(2, 5));
    a(paramString, "nro de registro", paramString.substring(9, 14));
    int i;
    if ((i = ((localObject = paramString.toUpperCase()).indexOf("MANE") == 5) ? 1 : 0) != 0)
      localObject = ((String)localObject).replace("MANE", "MANI");
    Object localObject = ((String)localObject).toCharArray();
   
    int j = 0;
    for (int k = 0; k < 15; ++k)
      j += localObject[k];
    k = j % 23 + 65;
    if (i != 0)
      ++k;
    switch (k)
    {
    case 73:
      k = 88;
      break;
    case 79:
      k = 89;
      break;
    case 81:
      k = 90;
      break;
    case 91:
      k = 65;
    }
    if (k == localObject[15])
      return;
    throw new b("destinacion [" + paramString + "] " + "con digito verificador [" + localObject[15] + "] invalido");
  }


mcs 24-07-2010 09:26:16

Hola,

Imagino que solo tienes problemas con este bloque de codigo:
Código:

    int j = 0;
    for (int k = 0; k < 15; ++k)
      j += localObject[k];
    k = j % 23 + 65;
    if (i != 0)
      ++k;

La traducción a Delphi sería:
Código:

j:=0;
for k:=0 to 15 do
  j:=j+localObject[k];

k:=(j mod 23) + 65;
if i<>0 then
  Inc(k);


waly2k1 24-07-2010 10:27:10

Hola mcs, desde ya muchas gracias por contestar

Esta es una Destinacion valida: '10042EC01004391D'
y te paso mi rutina
recorro la cadena (sDest) y voy cargando en el array mediante un for
porque desconozco las funciones para hacerlo mas 'comodo'

Pero el primer elemento del array pone 1 y el segundo q deberia ser 0 vuelve a repetir 1 y recien continua cargando bien, con lo cual me faltaria
un item (la D final) y desde el vamos que es invalida si no posee el digito
verificador. Estoy viendo eso ahora, pero si me trabo mucho mas le agrego un elemento mas al array y comienzo a contar desde el segundo elemento y listo. No puedo detenerme demasiado.

Saludos y muchisimas gracias!!!

Código:

function TData.ValDestinacion( sDest:string; blnMSG:boolean ):boolean;
var
    i: integer;
    j: integer;
    k: integer;
    aNro:array[0..15] of Char;
    iSuma: Integer;
begin
    iSuma := 0;
    i := Pos( 'MANE', sDest );
    sDest := ReplaceStr( sDest, 'MANE', 'MANI' );

    if Length( sDest ) <> 16 then
    begin
        Result := false;
        exit;
    end;

    for i := 0 to 15 do
    begin
        aNro[i] := Chr( Ord( Copy( sDest, i, 1 )[1] ) );
    end;

    j := 0;
    for k := 0 to 14 do
    begin
        j := j + Ord( aNro[k] );
    end;

    k := ( j mod 23 ) + 65;
    if i <> 0 then
    begin
        k := k + 1;
    end;

    case k of
        73:
            begin
                k:= 78;
            end;
        79:
            begin
                k:= 89;
            end;
        81:
            begin
                k:= 90;
            end;
        91:
            begin
                k:= 65;
            end;
    end;

    Result := ( k = Ord( aNro[15] ) );
end;



La franja horaria es GMT +2. Ahora son las 16:43:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi