#!/usr/bin/python3 # -------------------------------------------------------------------- # convert a number to a different base (positive integers only) # do not us any math modules - break it down yourself # -------------------------------------------------------------------- import sys import user_interface as ui DIGITS = '0123456789abcdef' # digit characters # -------------------------------------------------------------------- # ---- convert a number string to an integer # ---- base number string's base (integer) # ---- num_str number string # ---- return integer # -------------------------------------------------------------------- def convert_string_to_integer(base,num_str): digits = DIGITS[:base] num_int = 0 # intial numeric value for char in num_str.lower(): # for each character in the string idx = digits.find(char) if idx < 0: print() print(f'illegal number string character ({char})') return (False,0) num_int = num_int * base + idx return (True,num_int) # -------------------------------------------------------------------- # ---- convert an integer to a string of a given base # ---- base output base (integer) # ---- num_int integer # ---- return a string # -------------------------------------------------------------------- def convert_integer_to_string(base,num_int): digits = DIGITS[:base] num_str = '' while num_int > 0: ##print(f'num_int={num_int} base={base}') char = digits[num_int % base] idx = digits.find(char) if idx < 0: print() print(f'illegal number string character ({char})') return (False,0) num_str = digits[idx] + num_str num_int = int(num_int/base) return (True,num_str) # -------------------------------------------------------------------- # ---- ask the user for the output base # ---- return the number as a string (in the selected base) # -------------------------------------------------------------------- def get_integer_string_value(num_int): while True: print() base_str = ui.get_user_input('Enter output base: ') if not base_str: sys.exit() # empty string? tf,base = ui.is_integer(base_str) if not tf: print('unknown or bad base entered ({base})') continue # --- verify base if base < 2 or base > len(DIGITS): print() print(f'illegal base entered ({base})') continue break return convert_integer_to_string(base,num_int) # -------------------------------------------------------------------- # ---- ask the user for the input base and number (string) # ---- return the number's value # -------------------------------------------------------------------- def get_string_integer_value(): # ---- ask the user for the input number's base while True: print() base_str = ui.get_user_input('Enter input base: ') if not base_str: sys.exit() # empty string? tf,base = ui.is_integer(base_str) if not tf: print('unknown or bad base entered ({base})') continue # --- verify the base if base < 2 or base > len(DIGITS): print() print(f'illegal base entered ({base})') continue break # ---- ask the user for the input number (string) print() num_str = ui.get_user_input('Enter input number: ') if not num_str: sys.exit() # ---- return string's numeric value return convert_string_to_integer(base,num_str) # -------------------------------------------------------------------- # ---- main # -------------------------------------------------------------------- if __name__ == '__main__': while True: tf,num_int = get_string_integer_value() if not tf: continue print() print(f'integer\'s base 10 value is {num_int}') tf,num_str = get_integer_string_value(num_int) if not tf: continue print() print(f'integer\'s string value is {num_str}')