VBcoders Guest



Don't have an account yet? Register
 


Forgot Password?



Convert between different bases ranging from 2 to 36

by Waty Thierry (60 Submissions)
Category: Math/Dates
Compatability: Visual Basic 3.0
Difficulty: Unknown Difficulty
Originally Published: Tue 13th April 1999
Date Added: Mon 8th February 2021
Rating: (1 Votes)

Convert between different bases ranging from 2 to 36

Rate Convert between different bases ranging from 2 to 36



Option Explicit
Option Compare Text

'// Then declare this constant
Private Const csValidChars As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

'// Then all we have to do is to write a public function like this...
Public Function BCon(ByVal InputValue As String, ByVal InputBase As Long, ByVal OutputBase As Long) As String

   '// Declare following variables
   Dim cuOutputCharCount As Currency, lInputCharCount As Long
   Dim lCounter As Long, sCompareWith As String, sChar As String
   Dim dDecimalChars As Double, lPos As Long, cuBitValue As Currency
   Dim cuDecimalValue As Currency, sOutput As String

   '// Turn on error trapping
   On Error Resume Next

   '// Check to see that both InputBase and OutputBase are between 2 and 36 inclusively
   If (InputBase < 2) Or (InputBase > 36) Then
      BCon = ""
      Exit Function
   End If

   If (OutputBase < 2) Or (OutputBase > 36) Then
      BCon = ""
      Exit Function
   End If

   '// Now initiate translation into 10-based value
   InputValue = Trim(InputValue)
   lInputCharCount = Len(InputValue)
   sCompareWith = Left$(csValidChars, InputBase)

   '// Check to see that input string is at least one character
   If lInputCharCount < 1 Then
      BCon = ""
      Exit Function
   End If

   '// Loop through each character in input string. Check for invalid characters according to input base
   For lCounter = 1 To lInputCharCount
      sChar = Mid$(InputValue, lCounter, 1)
      If InStr(1, sCompareWith, sChar, vbTextCompare) < 1 Then
         BCon = ""
         Exit Function
      End If
   Next

   If InputBase = OutputBase Then
      BCon = InputValue
      Exit Function
   End If

   '// Now get the number of decimal characters needed to hold input value
   dDecimalChars = lInputCharCount * Log(InputBase) / Log(10)

   '// If decimal string is longer than 14 characters then exit function
   If dDecimalChars > 14 Then
      BCon = ""
      Exit Function
   End If

   If InputBase = 10 Then
      cuDecimalValue = CCur(InputValue)
   Else
      '// Initiate calculation into decimal value
      cuBitValue = 1
      cuDecimalValue = 0

      '// As long there are characters left in input string, add their value into the decimal hold variable
      While Len(InputValue) > 0
         sChar = Right(InputValue, 1)
         lPos = InStr(1, sCompareWith, sChar, vbTextCompare) - 1
         cuDecimalValue = cuDecimalValue + lPos * cuBitValue
         cuBitValue = cuBitValue * InputBase
         InputValue = Left(InputValue, Len(InputValue) - 1)
      Wend

      '// Now we can do a trick. If output base is 10, we already have the decimal value...
      If OutputBase = 10 Then
         BCon = CStr(cuDecimalValue)
         Exit Function
      End If
   End If

   '// Calculate number of characters in output string. If not an integer round up to nearest integer
   cuOutputCharCount = 1 + Log(cuDecimalValue) / Log(OutputBase)

   '// Now we must convert the decimal value back into a string in the output base format
   cuBitValue = 1
   For lCounter = 2 To cuOutputCharCount
      cuBitValue = cuBitValue * OutputBase
   Next

   '// As long as we have a decimal value greater than 0, add a character to the output string
   sOutput = ""
   sCompareWith = Left$(csValidChars, OutputBase)
   While cuBitValue > 0
      lPos = cuDecimalValue \ cuBitValue
      sChar = Mid$(sCompareWith, 1 + lPos, 1)
      sOutput = sOutput & sChar
      cuDecimalValue = cuDecimalValue - lPos * cuBitValue
      cuBitValue = cuBitValue \ OutputBase
   Wend

   '// Strip leading zeros
   While Left$(sOutput, 1) < "1"
      sOutput = Right$(sOutput, Len(sOutput) - 1)
   Wend

   '// Let BCon function value be the output string in output base format
   BCon = sOutput

End Function




Download this snippet    Add to My Saved Code

Convert between different bases ranging from 2 to 36 Comments

No comments have been posted about Convert between different bases ranging from 2 to 36. Why not be the first to post a comment about Convert between different bases ranging from 2 to 36.

Post your comment

Subject:
Message:
0/1000 characters