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

 

  Dicas

  Visual Basic    (Datas/Números/Strings)

Título da Dica:  Conversão de qualquer base para decimal e vice-versa
Postada em 23/4/2001 por Marcos      Clique aqui para enviar email para o autor  federicce@hotmail.com
' O codigo a seguir permite transformar um numero em
' base decimal para qualquer base e de qualquer base
' para base decimal, alterado-se apenas o valor
' da constante BASE_NUMERICA.

Const BASE_NUMERICA As Byte = 16 ' Base numérica a ser utilizada

Public Function fcDec2Base(ByVal prNumero As Double) As String
    
    ' *************************************************************** '
    '   Propósito:    Converter um valor em base decimal para a       '
    '                 base determinada na constante BASE_NUMERICA.   '
    '   Entrada:      Número decimal a ser convertido.                '
    '   Saída:        Resultado da conversão na nova base ou -1       '
    '                 se o número passado for negativo.               '
    '   Autor/Data:   Marcos Federicce - 22/04/2001                   '
    ' *************************************************************** '
    
    Dim dblResto As Double      ' Armazena o resto da divisao do numero a
                                ' ser convertido pela nova base numerica
    
    ' Se o numero a ser convertido for negativo, retornar -1 e sair da funcao
    If prNumero < 0 Then
       fcDec2Base = -1
    Else
        ' Se o numero for positivo, enquanto o numero nao for igual a zero,
        ' o que indica que ele jah foi convertido
        Do While prNumero <> 0
           ' Obter o resto da divisao do numero a ser convertido para
           ' a nova base. É como o operador "Mod" do proprio VB. Ele nao
           ' foi utilizado aqui pois causa Overflow para números maiores ou
           ' iguais a (2^32)/2, ou seja, o limite do Long positivo
           dblResto = prNumero - (Int(prNumero / BASE_NUMERICA) * BASE_NUMERICA)
           ' Se o resto da divisao for menor que 10, o que significa que o
           ' caracter a ser utilizado será um algarismo numérico e nao uma letra,
           ' entao concatena esse numero à esquerda do resultado final.
           If dblResto < 10 Then
              fcDec2Base = Chr(Asc(dblResto)) & fcDec2Base
           Else
              ' Se o resto da divisao for maior ou igual a 10, significa q o
              ' caracter a ser utilizado nao será um algarismo numérico, e sim
              ' uma letra. Essa letra é calculada somando-se o valor (na
              ' tabela ASCII) da letra "A" com o resto da divisao, obtendo-se
              ' o novo caracter. É subtraído 10 do resultado pois essa é a quantidade
              ' de números existentes antes do 10 (de 0 a 9).
              fcDec2Base = Chr(Asc("A") + dblResto - 10) & fcDec2Base
           End If
           ' prNumero passará a ser o quociente dele mesmo pela nova base numerica.
           prNumero = Int(prNumero / BASE_NUMERICA)
        Loop
        ' Se o parametro passado for 0, ele nao entrará no Do While. Para que a funcao
        ' nao retorne "" caso o programador passe 0 como parametro, existe esse If
        ' abaixo para converter o "" em 0.
        If fcDec2Base = "" Then fcDec2Base = "0"
    End If
    
End Function

Public Function fcBase2Dec(ByVal prNumero As String) As Double
    
    ' *************************************************************** '
    '   Propósito:    Converter um valor da base especificada na      '
    '                 constante BASE_NUMERICA para base decimal.     '
    '   Entrada:      Número a ser convertido para base decimal.      '
    '   Saída:        Resultado da conversão para base decimal ou     '
    '                 -1 se for passado algum caractere que nao       '
    '                 pertence a simbologia da base especificada      '
    '   Comentário:   ATENCAO: Essa funcao possui a limitacao de      '
    '                 nao conseguir trabalhar com números em          '
    '                 notacao de engenharia, ou seja, 1E+15, ao       '
    '                 invés de 1000000000000000, em base decimal,     '
    '                 por exemplo. O VB comeca a trabalhar com esse   '
    '                 tipo de notacao quando o numero possui mais     '
    '                 de 15 algarismos.                               '
    '   Autor/Data:   Marcos Federicce - 22/04/2001                   '
    ' *************************************************************** '
    
    Dim intLoop As Integer              ' Contador para o For
    Dim strChar As String * 1           ' Armazenará caracter a caracter o numero passado
    Dim dblMultiplicador As Double      ' Produto da base elevado ao numero da coluna
                                        ' do algarismo
    
    ' Escaneia cada caracter da direita para a esquerda
    For intLoop = Len(prNumero) To 1 Step -1
        ' O multiplicador é igual a base ^ ao (numero da coluna - 1)
        dblMultiplicador = BASE_NUMERICA ^ (Len(prNumero) - intLoop)
        ' Armazena o caracter/algarismo
        strChar = UCase(Mid(prNumero, intLoop, 1))
        ' Se for um valor numerico (entre 0 e 9), o resultado será esse
        ' algarismo multiplicado pelo Multiplicador daquela coluna mais o
        ' resultado atual.
        If (strChar >= "0") And (strChar <= "9") Then
            fcBase2Dec = fcBase2Dec + (CByte(strChar) * dblMultiplicador)
        Else
            ' Se o valor nao for numerico, mas estiver dentro da simbologia permitida
            If (strChar >= "A") And (strChar <= Chr(Asc("A") + (BASE_NUMERICA - 10))) Then
                ' Transforma o simbolo em um número o o multiplica pelo Multiplicador
                ' daquela coluna, somando o resultado ao resultado atual.
                fcBase2Dec = fcBase2Dec + ((Asc(strChar) - Asc("A") + 10) * dblMultiplicador)
            Else
                ' Se o valor nao está dentro da simbologia permitida, retorna -1
                ' e a funcao é abortada
                fcBase2Dec = -1
                Exit Function
            End If
        End If
    Next intLoop
    
End Function
 


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