computing codes

Conversion of numbers- Python codes

Description:

The following Python codes are for the conversion of numbers from one base to another. Base can be any number between 2 (binary) and 16 (hexadecimal). The main code is “nsysconv.py”, which uses functions defined in the other codes (also supplied). These codes were written based on the descriptions in Number Systems, Part 1, and Number Systems, Part 2. They are provided “as is”. Modification may be required in order to achieve users’ other purposes (such as expanding the codes for bases greater than 16). For the main code to work properly, the class and function files must be named correctly, i.e., “calc.py” and “funs.py”, respectively, and placed in the same directory (folder) as the main code.

Python codes

# main - file name: nsysconv.py
from calc import *

num = input("Enter the number to be converted: ")
b1 = int(input("Enter the number's base: "))
b2 = int(input("Enter the new base (from 2 to 16): "))
# Check if the new base if different from the entered number's base
if b2 == b1:
   print("\nError: the two number systems have the same base")
   exit()
# Check whether the entered number is consistent with its base        
for d in num:
   if d != '.':
      if (myInt(d)>=b1) or (myInt(d)<0):
         print("\nError, the entered number is outside of the base's range")
         exit()
# Start conversion
x = Calc(b1,b2,num)
if b2 == 10:
   new_n = x.b2_10()
   print("The equivalent decimal number is:",end=" ")
   print(new_n)
elif b1==10:
   new_n = x.b1_10()
   print("Equivalent value in the new number system is:",end=" ")
   print(new_n)
else:
   n = x.b2_10()
   new_n = Calc(b1,b2,str(n)).b1_10()
   print("Equivalent value in the new number system is:",end=" ")
   print(new_n)
# file name: calc.py
from funs import *

class Calc:
   def __init__(self,b1,b2,num):
      self.b1 = b1
      self.b2 = b2
      self.num = num
      self.prd = False
      self.num1 = []
      self.num2 = []
  
   def checkn(self):
   # Check if there is a fractional part in the number
      cnt = 0
      n = self.num
      n1 = self.num1
      n2 = self.num2
      pd = self.prd
      for d in n:
         if d != ".":
           cnt += 1
         elif d==".":
           pd = True
           break
      if pd == True:
         n1 = n[0:cnt]
         n2 = n[cnt+1:]
      return pd,n1,n2

   def b2_10(self):
      pd, n1, n2 = Calc.checkn(self) 
      n = self.num
      b1 = self.b1
      b2 = self.b2
      if pd == True:
         l = len(n1)
         x = 0.0
         for d in n1:
            l -= 1
            x += myInt(d)*b1**(l) 
         for d in n2:
            l -= 1
            x += myInt(d)*b1**(l)     
      else :
         l = len(n)
         x = 0
         for d in n:
            l -= 1
            x += myInt(d)*b1**(l) 
      return x

   def b1_10(self):
      pd, n1, n2 = Calc.checkn(self)     
      n = self.num
      b1 = self.b1
      b2 = self.b2
      if pd == True: 
         tol = 1e-6
         l2 = len(n2)
         k = l2  # num of digits after the whole number
         nn1 = int(n1)
         fn = float(n)
         nn2 = fn - nn1  
         # whole number
         q,r = divmod(nn1,b2)
         x = mySym(r)
         while (q>0):
            nn = q
            q, r =divmod(nn,b2)
            x = mySym(r) + x
         # Fractional part
         m = 1/b2
         q,r =divmod(nn2,m)
         x = x + "." + mySym(int(q))
         i=1
         while (r>tol) and (i<k):
            nn = r
            m *= (1/b2)
            q, r =divmod(nn,m)
            x += mySym(int(q))
            i += 1
#         print(x)
      else :
         nn = int(n)
         # whole number
         q,r = divmod(nn,b2)
         x = mySym(r)
         while (q>0):
            nn = q
            q, r =divmod(nn,b2)
            x = mySym(r) + x
#         print(x)
      return x
# file name: funs.py
def myInt(x):
   switcher = {
      '0': 0,
      '1': 1,
      '2': 2,
      '3': 3,
      '4': 4,
      '5': 5,
      '6': 6,
      '7': 7,
      '8': 8,
      '9': 9,
      'A': 10,
      'a': 10,
      'B': 11,
      'b': 11,
      'C': 12,
      'c': 12,
      'D': 13,
      'd': 13,
      'E': 14,
      'e': 14,
      'F': 15,
      'f': 15,
   }
   return switcher.get(x, "out of range")

def mySym(x):
   switcher = {
      0: '0',
      1: '1',
      2: '2',
      3: '3',
      4: '4',
      5: '5',
      6: '6',
      7: '7',
      8: '8',
      9: '9',
      10: 'A',
      11: 'B',
      12: 'C',
      13: 'D',
      14: 'E',
      15: 'F',
   }
   return switcher.get(x, "out of range")