|
|
|
|
|
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
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
|
|
|
|
|