Conversão de Asp para JSP

4 respostas
X
Ola pessoal... estou com problemas nestes 2 metodos que estão me devolvendo resultados diferentes do que o código ASP transmitia: é um sistema de Boleto Bancario... Estes 2 métodos devem devolver o resultado de 3 digitos verificadores do boleto... Método 1 ASP:
FUNCTION CALCDIG10(cadeia)
dim mult
dim total
dim pos,res

	mult=(len(cadeia) mod 2) 
	mult=mult+1
	total=0
	for pos=1 to len(cadeia)
		res= mid(cadeia, pos, 1) * mult
		if res>9 then
			res=int(res/10) + (res mod 10)
		end if
		total=total+res
		if mult=2 then
			mult=1
		else
			mult=2
		end if
	next
	total=((10-(total mod 10)) mod 10 )
	CALCDIG10=total
END FUNCTION
JAVA:
public String do_calculodig10(String cadeia){
        int total = 0;
        int mult = (cadeia.length()%2)+1;
        for (int pos = 1; pos <= cadeia.length(); pos++){
            int res = mult*Integer.parseInt(cadeia.charAt(pos-1)+"");
            if(res>9){
                res = (int)res/10 + res%10;
            }
            total = total + res;
            if(mult == 2){
                mult = 1;
            }
            else{//60
                mult = 2;
            }
        }
        total = ((10-(total % 10)) % 10);
        return ""+total;
    }
Método 2 ASP:
FUNCTION CALCDIG11(cadeia,limitesup,lflag)
'**************************
dim mult
dim total
dim nresto
dim ndig
dim pos

mult=1 + (len(cadeia) mod (limitesup-1))
if mult=1 then
	mult=limitesup
end if
total=0
for pos=1 to len(cadeia)
	total=total+(mid(cadeia,pos,1) * mult)
	mult=mult-1
	if mult=1 then
		mult=limitesup
	end if
Next
nresto=(total mod 11)
if lflag = 1 then
	calcdig11=nresto
else
	if nresto=0 or nresto=1 or nresto=10 then
		ndig=1
	else
		ndig=11 - nresto	
	end if
	calcdig11=ndig
end if

'*************************
END FUNCTION
JAVA:
public int do_calculodig11(String cadeia,int limitesup,int lflag){
        int mult = 1 + (cadeia.length()%(limitesup-1));
        int total = 0;
        if(mult==1){
            mult = limitesup;
        }
        for(int pos = 1; pos <= cadeia.length(); pos++){
            total = total + (mult*Integer.parseInt(cadeia.charAt(pos-1)+""));
            if (mult==1){
                mult = limitesup;
            }
        }
        int resto = total % 11;
        if(lflag == 1){//80
            return resto;
        }        
        else{
            if (resto == 0 || resto == 1 || resto == 10){
              total = 1;  
            }
            else{
              total = 11-resto;
            }
            return total;
        }
    }

Alguem consegue notar alguma diferença que pode estar afetando o código?! :???:

4 Respostas

V

Método 1:
na linha res=int(res/10) + (res mod 10) o método int() arredonda ou trunca a divisão?

Método 2:
parece estar correto, mas o q é a função mid() ?

X

a função mid seria como um substring segundo meu chefe disse…
ela pegaria a partir do caractere y, x caracteres…
campo 1 = abcsd
x = 2
y = 3
mid(campo1,x,y) bcs…
pelo que entendi da lógica não deveria ser arredondada…
estes métodos são para chegar em 3 digitos verificadores do boleto… aqui esta a lógica destes digitos:
DIGITO!

DIGITO 2

  • DÍGITO 2 - D2
    A A A T T C C C C C D N N N N N N N 0 0 0 3 3 D1 - > CHAVE +
    7 6 5 4 3 2 7 6 5 4 3 2 7 6 5 4 3 2 7 6 5 4 3 2 DÍGITO 1

P P P P P P P P P P P P P P P P P P P P P P P P
Pesos - > começando com 2 da direita para esquerda.
. Multiplicar os dígitos pelos pesos
. Realizar somatório de P, obtendo K
. Dividir k por 11
A . Se resto = 10, proceder conforme item D.
B . Se resto = 0 - - - > D2 = 0
C . Se resto = 1 - - - > Se D1 = 9, substituir o valor de D1 por 0 e recalcular D2.
Se D1 < 9, somar 1 a D1, substituir o valor de D1 e
recalcular D2.
OBSERVAÇÃO: O D1 será o novo valor apurado.
Recalcular o D2 enquanto resto for igual a 1.
D . Se resto > 1 - - - - > D2 = 11 - resto.


Digito 3

  • DÍGITO 2 - D2
    A A A T T C C C C C D N N N N N N N 0 0 0 3 3 D1 - > CHAVE +
    7 6 5 4 3 2 7 6 5 4 3 2 7 6 5 4 3 2 7 6 5 4 3 2 DÍGITO 1

P P P P P P P P P P P P P P P P P P P P P P P P
Pesos - > começando com 2 da direita para esquerda.
. Multiplicar os dígitos pelos pesos
. Realizar somatório de P, obtendo K
. Dividir k por 11
A . Se resto = 10, proceder conforme item D.
B . Se resto = 0 - - - > D2 = 0
C . Se resto = 1 - - - > Se D1 = 9, substituir o valor de D1 por 0 e recalcular D2.
Se D1 < 9, somar 1 a D1, substituir o valor de D1 e
recalcular D2.
OBSERVAÇÃO: O D1 será o novo valor apurado.
Recalcular o D2 enquanto resto for igual a 1.
D . Se resto > 1 - - - - > D2 = 11 - resto.

V

se pela lógica não existe arredondamento o teu método um estaria correto e inclusive o cast (int) não seria necessário pois qdo usa-se o operador / com operandos do tipo int o calculo realizado retorna somente a parte inteira da divisão.

com relação ao mid(), perceba que no Java o método substring(x,y) significa que a substring inclui o caractere de índice x até o caractere de índice y-1, portano é bom dar uma revisada nesta parte do código.

X
Criei um outro arquivo e resumi o código para tentar verificar aonde é o erro... e tem um erro sim... o ASP retorna 4 e o JSP 7 ASP
valortal1=CALCdig11&#40;&quot;0339000000000103581481302647800076960003348&quot;,9,0&#41;
response.write valortal1

'**************************
FUNCTION CALCDIG11&#40;cadeia,limitesup,lflag&#41;
'**************************
dim mult
dim total
dim nresto
dim ndig
dim pos

mult=1 + &#40;len&#40;cadeia&#41; mod &#40;limitesup-1&#41;&#41;
if mult=1 then
	mult=limitesup
end if
total=0
for pos=1 to len&#40;cadeia&#41;
	total=total+&#40;mid&#40;cadeia,pos,1&#41; * mult&#41;
	mult=mult-1
	if mult=1 then
		mult=limitesup
	end if
Next
nresto=&#40;total mod 11&#41;
if lflag = 1 then
	calcdig11=nresto
else
	if nresto=0 or nresto=1 or nresto=10 then
		ndig=1
	else
		ndig=11 - nresto	
	end if
	calcdig11=ndig
end if

'*************************
END FUNCTION
JSP
&#40;...&#41;
Boleto a;
    a = new Boleto&#40;&#41;;
    String aux = &quot;&quot;+a.do_calculodig11&#40;&quot;0339000000000103581481302647800076960003348&quot;,9,0&#41;;
&#40;...&#41;
Classe Boleto:
public int do_calculodig11&#40;String cadeia,int limitesup,int lflag&#41;&#123;
        int mult = 1 + &#40;cadeia.length&#40;&#41;%&#40;limitesup-1&#41;&#41;;
        int total = 0;
        if&#40;mult==1&#41;&#123;
            mult = limitesup;
        &#125;
        for&#40;int pos = 1; pos &lt;= cadeia.length&#40;&#41;; pos++&#41;&#123;
            total = total + &#40;mult*Integer.parseInt&#40;cadeia.charAt&#40;pos-1&#41;+&quot;&quot;&#41;&#41;;
            if &#40;mult==1&#41;&#123;
                mult = limitesup;
            &#125;
        &#125;
        int resto = total % 11;
        if&#40;lflag == 1&#41;&#123;//80
            return resto;
        &#125;        
        else&#123;
            if &#40;resto == 0 || resto == 1 || resto == 10&#41;&#123;
              total = 1;  
            &#125;
            else&#123;
              total = 11-resto;
            &#125;
            return total;
        &#125;
    &#125;
Criado 4 de agosto de 2005
Ultima resposta 9 de ago. de 2005
Respostas 4
Participantes 2