练习:自撸整数进制转换器(二、八、十六进制转十进制)



整数进制转换器(二、八、十六进制转十进制)


  1. 题目
  2. 代码运行效果
  3. 我的解题思路
  4. 转换器完整代码

题目

  跟着寒佬整数进制转换,生发自撸一个进制转换器的想法。
   准备实现效果:输入十、二、八、十六进制,python 代码都不会因异常中断(输入错误异常),正常输出十进制数值。经过一番挣扎,实现了预期目标。🤠🤠


上段试炼代码先🤓
输入十、二、八、十六进制试炼
#可以输入十进制
s = 898
num = to_decimalism(s)
print(f"\n\n{color(' 进制转换 ', 'green', 'black', 'light'):_^52}\
\n\n\n{color(s, 'green'):>24},\
转换十进制:{color(num, 'green')}")
if num is not None:
    input(f"\n {'int(s) 验算:':>20}\
{color(int(s), 'green')}\n\
\n\n{color(' The end ', 'green', 'black', 'lobright'):_^56}\
\n")

#二进制试炼
s = '0B01011'
num = to_decimalism(s)
print(f"\n\n{color(' 进制转换 ', 'green', 'black', 'light'):_^52}\
\n\n\n{color(s, 'green'):>24},\
转换十进制:{color(num, 'green')}")
if num is not None:
    input(f"\n {'int(s) 验算:':>20}\
{color(int(s, 2), 'green')}\n\
\n\n{color(' The end ', 'green', 'black', 'lobright'):_^56}\
\n")

#八进制试炼
s = '0O07011'
num = to_decimalism(s)
print(f"\n\n{color(' 进制转换 ', 'green', 'black', 'light'):_^52}\
\n\n\n{color(s, 'green'):>24},\
转换十进制:{color(num, 'green')}")
if num is not None:
    input(f"\n {'int(s) 验算:':>20}\
{color(int(s, 8), 'green')}\n\
\n\n{color(' The end ', 'green', 'black', 'lobright'):_^56}\
\n")

#十六进制试炼
s = '0x0F11'
num = to_decimalism(s)
print(f"\n\n{color(' 进制转换 ', 'green', 'black', 'light'):_^52}\
\n\n\n{color(s, 'green'):>24},\
转换十进制:{color(num, 'green')}")
if num is not None:
    input(f"\n {'int(s) 验算:':>20}\
{color(int(s, 16), 'green')}\n\
\n\n{color(' The end ', 'green', 'black', 'lobright'):_^56}\
\n")
代码运行效果

在这里插入图片描述


回首页

有异常的输入试炼
for i in range(999, 1000):
    print(f"\n整数{color(str(i), 'cyan', 'black', 'light'):16}:\
\n0b{color(bin(i)[2:].zfill(8), 'green')},\
to_decimalism转换{color(str(to_decimalism(bin(i))), 'green'):16},\
\n0o{color(oct(i)[2:].zfill(8),'green')},\
to_decimalism转换{color(str(to_decimalism(oct(i))), 'green'):16},\
\n0x{color(hex(i)[2:].zfill(8),'green')},\
to_decimalism转换{color(str(to_decimalism(hex(i))), 'green'):16}。\
")

print('\n'*3)
nums_0b = '0b111111111111111111111111111111', \
'0b05011', \
'0c01011', \
'0b011111111111111111111111111111011', \
'0b01011', \
'0b110011'
for k, num_0b in enumerate(nums_0b):
    print(f'{k + 1}. {color(num_0b, "green")} 转十进制:\
{color(to_decimalism(num_0b), "cyan")}')

print(f"\n\n{color(1, 'gray', 'black', 'lobright')}\
{' Cut-off rule ':.^42}{color(0)}\n")

print(f"\n用 {color('int 函数', 'green', 'black', 'light')}检验:\n")
for k, num in enumerate(nums_0b):
    try:
        print(f'{k + 1}. 二进制数 {color(num_0b, "green")} 转十进制:\
{color(int(num, 2), "cyan")}')
    except:
        error(f'二进制数 {color(num_0b, "red")}错误')
代码运行效果

在这里插入图片描述


回首页

我的解题思路

  我的思路:
  0. 接收输入字符 >> 2. 转换字符串中大写英文字母为小写,方便后续操作。>> 3. 确认字符串格式正确 >> 4. 前导零去除 5. 判断输入进制 >> 6. 从字典获取字符对应值转换十进制
  • 转换大写英文字母代码
for i in ('B', 'O', 'X', 'A', 'B', 'C', 'D', 'E', 'F'):
    s = s.replace(i, i.lower())
  • 确认字符串格式正确代码
def isinput(s, lis):
    '''输入判定:
    判定s的字符元素都在lis'''
    for i in lis: #遍历进制构成列表。
        s = s.replace(i, '') #依次清除构成列表的字符。
    return s #返回判定后的列表
  • 前导零去除代码
def del_zero(s):
    '''去除前导零'''
    if s[0] != '0': #没有前导零,
        return s #返回传入字符串。
    for k, i in enumerate(s): #遍历枚举字符串,方便使用下标。
        if i != '0': #前导不为0,
            return s[k:] #返回当前往后的字符串。
  • 输入字符进制判断
        if b == 'b': #二进制字符串处理分支。
            if isinput(s[2:], ['1', '0']) != '': #判定二进制字符串结构是否合规。
                error(f'二进制数结构{color(s, "red")}') #异常报错。
                return #返回空。
            if len(del_zero(s[2:])) > 32: #大于32位报错。
                error(f'二进制数 {color(s, "red")} 大于32位') #异常报错。
                return #返回空。
            return to_decimal((s[2:]), 2) #返回转换十进制数。
        elif b == 'o': #八进制字符串处理分支。
            rule = [
            '0', '1', '2', '3', 
            '4', '5', '6', '7'
            ] #十六进制码表
            if isinput(s[2:], rule) != '': #判定八进制字符串结构是否合规。
                error(f'八进制数 {color(s, "red")} :') #判定二进制字符串结构是否合规。
                return #返回空。
            return to_decimal(del_zero(s[2:]), 8) #返回转换十进制数。
        elif b == 'x': #十六进制字符串处理分支。
            rule = [
            '0', '1', '2', '3', 
            '4', '5', '6', '7', 
            '8', '9', 'a', 'b', 
            'c', 'd', 'e', 'f', 
            ] #十六进制码表
            if isinput(s[2:], rule) != '': #判定十六进制字符串结构是否合规。
                error(f'十六进制数 {color(s, "red")} :') #报错打印。
                return #返回空。
            return to_decimal(del_zero(s[2:]), 16) #返回转换十进制数。
  • 字符对应值转换十进制数值代码
def to_decimal(s, n):
    '''进制转换'''
    if s == '': #传入字符为空,
        return 0 #返回 0 。
    nums_dict = {
    	'0': 0, '1': 1, '2': 2, 
    	'3': 3, '4': 4, '5': 5, 
    	'6': 6, '7': 7, '8': 8, 
    	'9': 9, 'a': 10, 'b': 11, 
    	'c': 12, 'd': 13, 'e': 14, 
    	'f': 15, 
    	} #转换所需字符字典。
    tmp = [nums_dict.get(i) 
    for i in list(s)] #列表解析字符对应值。
    num, k = tmp.pop(), 1 #初始返回转换值为字符最后一位对应值,进制转换幂为 1 。
    while tmp != []: #要转换的数位列表弹空结束循环。
        num += tmp.pop()*n**k #累加各数位的值。
        k += 1 #数位向前进一。
    return num #返回数位字符串的十进制数值。

回首页


核心 Python 代码
(如果从语句注释不能清楚作用,请评论区留言指教和探讨。🤝)
#!/usr/bin/env python # Linux 脚本解释器路径指定注释。
# coding: utf-8 #本脚本编码说明。
from python_color import color #用 \033[m “自制”输出色彩控制模块加载。


'''
作者:梦幻精灵_cq
QQ:479469838(八爪章鱼)

'''


def error(s): input(f"\n\n{s}:\
{color('Is Error!', 'red', 'black','light')} \
{color('Try Again!', 'green')}\
\n{'':.^42}\n") #异常捕获提示字符打印。


def del_zero(s):
    '''去除前导零'''
    if s[0] != '0': #没有前导零,
        return s #返回传入字符串。
    for k, i in enumerate(s): #遍历枚举字符串,方便使用下标。
        if i != '0': #前导不为0,
            return s[k:] #返回当前往后的字符串。



def to_decimal(s, n):
    '''进制转换'''
    if s == '': #传入字符为空,
        return 0 #返回 0 。
    nums_dict = {
    	'0': 0, '1': 1, '2': 2, 
    	'3': 3, '4': 4, '5': 5, 
    	'6': 6, '7': 7, '8': 8, 
    	'9': 9, 'a': 10, 'b': 11, 
    	'c': 12, 'd': 13, 'e': 14, 
    	'f': 15, 
    	} #转换所需字符字典。
    tmp = [nums_dict.get(i) 
    for i in list(s)] #列表解析字符对应值。
    num, k = tmp.pop(), 1 #初始返回转换值为字符最后一位对应值,进制转换幂为 1 。
    while tmp != []: #要转换的数位列表弹空结束循环。
        num += tmp.pop()*n**k #累加各数位的值。
        k += 1 #数位向前进一。
    return num #返回数位字符串的十进制数值。

def isinput(s, lis):
    '''输入判定:
    判定s的字符元素都在lis'''
    for i in lis: #遍历进制构成列表。
        s = s.replace(i, '') #依次清除构成列表的字符。
    return s #返回判定后的列表


def to_decimalism(s):
    '''进制转换 >> 十进制'''
    s = str(s) #转输入为字符串。\
    # (防输入十进制数字出错。本来是字符串再用 str() 也无仿。)
    # 反斜杠续行,对 # 注释语句无效,折行也得 # 打头。
    if s.isdigit(): #是纯数字字符串,
        return del_zero(s) #去除前导零返回。
    else: #不为纯数字,大写英文字母转小写,便于后续操作。
        for i in ('B', 'O', 'X',
        	'A', 'B', 'C', 'D', 'E', 'F'):
            s = s.replace(i, i.lower())
    b = s[1]
    if b not in ('b', 'o', 'x') \
     and not b.isdigit(): #不是纯数字,进制符不对报错。
    #(本 if 可与上条 if 写在一起,但会增加一层缩进。个人看着不爽。🤪)
        error(s) #调用报错信息打印。
    else: #这句可以不要,把后面三个 if 向前推一个缩进。
    #那样,结构性稍显不明析。
        if b == 'b': #二进制字符串处理分支。
            if isinput(s[2:], ['1', '0']) != '': #判定二进制字符串结构是否合规。
                error(f'二进制数结构{color(s, "red")}') #异常报错。
                return #返回空。
            if len(del_zero(s[2:])) > 32: #大于32位报错。
                error(f'二进制数 {color(s, "red")} 大于32位') #异常报错。
                return #返回空。
            return to_decimal((s[2:]), 2) #返回转换十进制数。
        elif b == 'o': #八进制字符串处理分支。
            rule = [
            '0', '1', '2', '3', 
            '4', '5', '6', '7'
            ] #十六进制码表
            if isinput(s[2:], rule) != '': #判定八进制字符串结构是否合规。
                error(f'八进制数 {color(s, "red")} :') #判定二进制字符串结构是否合规。
                return #返回空。
            return to_decimal(del_zero(s[2:]), 8) #返回转换十进制数。
        elif b == 'x': #十六进制字符串处理分支。
            rule = [
            '0', '1', '2', '3', 
            '4', '5', '6', '7', 
            '8', '9', 'a', 'b', 
            'c', 'd', 'e', 'f', 
            ] #十六进制码表
            if isinput(s[2:], rule) != '': #判定十六进制字符串结构是否合规。
                error(f'十六进制数 {color(s, "red")} :') #报错打印。
                return #返回空。
            return to_decimal(del_zero(s[2:]), 16) #返回转换十进制数。

回首页

我的HOT博:

    • 1
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 打赏
      打赏
    • 1
      评论
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    梦幻精灵_cq

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值