USUÁRIO:      SENHA:        SALVAR LOGIN ?    Adicione o VBWEB na sua lista de favoritos   Fale conosco 

 

  Fórum

  Visual Basic
Voltar
Autor Assunto:  Preciso que esta rotine funcione com nros grandes
Perk
SÃO PAULO
SP - BRASIL
ENUNCIADA !
Postada em 09/07/2007 22:02 hs         
Tempos atrás nosso amigo Waldir Júnior me ajudou neste tópico: http://www.vbweb.com.br/forum_resp.asp?Codigo=215026 me fornecendo a seguinte função:
 
txtvalor = Text1
   Do While Len(Trim$(txtvalor)) > 1
       dblNum1 = CDbl(txtvalor)
       txtvalor = ""
       For x = 1 To Len(Trim$(dblNum1)) - 1
           dblNum2 = CDbl(Mid$(Trim$(dblNum1), x, 1)) + CDbl(Mid$(Trim$(dblNum1), x + 1, 1))
           For y = 1 To Len(Trim$(dblNum2)) - 1
               dblNum2 = CDbl(Mid$(Trim$(dblNum2), y, 1)) + CDbl(Mid$(Trim$(dblNum2), y + 1, 1))
           Next
           txtvalor = txtvalor & dblNum2
       Next
       Text1 = Text1 & Chr(13) & Chr(10) & txtvalor
   Loop
Só que agora ao usar a função de verdade ela dá erro quando Text1 tem números com mais de 16 dígitos. Eu preciso usar no Text1 números com até 38 dígitos.
Tentei substituir a função CDbl() por CCur() mas daí dá overflow ao invés de Type Mismatch.
 
Como arrumar esta função para funcionar com tantos dígitos numéricos e inteiros ?

<<<< Vivendo e aprendendo >>>>
   
Tekki
Pontos: 2843 Pontos: 2843 Pontos: 2843
UBERLÂNDIA
MG - BRASIL
ENUNCIADA !
Postada em 10/07/2007 01:29 hs            
O problema é que o número é convertido para hexadecimal, por exemplo o número
99999999999999999999999999999999999999 em hexa vira 1E+38 quando você usa o Mid e tenta transformar o E em Cdbl ocorre o erro 13, também ocorrerá quando tentar transformar o + em cdbl.
Outro exemplo, o número 264572645726457264572645726457 vira 2,64572645726457E+29 neste caso você tem , E +
Se entendi o seu problema acho que a solução é simples, basta não usar esta conversão dblNum1 = CDbl(txtvalor) use como string.
Ex:
Dim dblNum1 as Sgring
dblNum1 = txtvalor

Veja este exemplo.
Dim dblNum1 As String
'txtvalor = Text1
txtvalor = "987654321987654321987654321987654321987654321987654321"
   Do While Len(Trim$(txtvalor)) > 1
       dblNum1 = txtvalor
       txtvalor = ""
       For x = 1 To Len(Trim$(dblNum1)) - 1
           dblNum2 = CInt(Mid$(Trim$(dblNum1), x, 1)) + CInt(Mid$(Trim$(dblNum1), x + 1, 1))
           For y = 1 To Len(Trim$(dblNum2)) - 1
               dblNum2 = CInt(Mid$(Trim$(dblNum2), y, 1)) + CInt(Mid$(Trim$(dblNum2), y + 1, 1))
           Next
           txtvalor = txtvalor & dblNum2
       Next
       Text1 = Text1 & Chr(13) & Chr(10) & txtvalor
   Loop

Neste caso você não vai ter problema de Type Mismatch pois o vb não vai converter a String para hexadecimal e onde você usa o mid como o retorno é sempre um único digito você pode usar o cint no lugar do cdbl.

Eu fiz teste e consegui montar com números superiores a 38 dígitos. O número do exemplo tem 54 digitos. Mas fiz teste com o número de 108 dígitos (na verdade uma string com 108 caracteres)
 
987654321987654321987654321987654321987654321987654321987654321987654321987654321987654321987654321987654321
 
Veja se isto resolve o problema.
   
Perk
SÃO PAULO
SP - BRASIL
ENUNCIADA !
Postada em 10/07/2007 09:58 hs         
Perfeito !!!!
Obrigadaço Tekki

<<<< Vivendo e aprendendo >>>>
   
Página(s): 1/1    

CyberWEB Network Ltda.    © Copyright 2000-2024   -   Todos os direitos reservados.
Powered by HostingZone - A melhor hospedagem para seu site
Topo da página