字符串进制转换输出异常:旧进制转新进制结果不符合预期
问题分析与修复
你遇到的问题核心出在base10toN函数中处理余数转字符的条件判断上,导致余数10被错误转换成了:而不是预期的A。
错误原因
看这段关键代码:
converted_string = chr(48 + mod + 7*(mod > 10)) + converted_string
当余数mod等于10时,mod > 10的结果是False,所以计算时加的是7*0=0,最终得到的ASCII码是48+10=58,对应的字符就是:。但我们需要余数10对应A(ASCII码65),这时候条件应该是余数大于等于10,这样mod=10时会触发7*1=7,48+10+7=65刚好是A的ASCII码。
修复后的代码
只需要修改base10toN函数里的条件判断即可:
import math def base_encode(number, base): # sanitize inputs number = str(number).lower() base = int(base) # legal characters known_digits = '0123456789abcdefghijklmnopqrstuvwxyz' value = { ch:val for val,ch in enumerate(known_digits) if val<base } # handle negative values if number[0]=='-': sign = -1 number = number[1:] else: sign = 1 # do conversion total = 0 for d in number: try: total = total*base + value[d] except KeyError: if d in known_digits: raise ValueError("invalid digit '{0}' in base {1}".format(d, base)) else: raise ValueError("value of digit {0} is unknown".format(d)) return sign*total def base10toN(num, base): """Change ``num'' to given base Upto base 36 is supported.""" converted_string, modstring = "", "" currentnum = num if not 1 < base < 37: raise ValueError("base must be between 2 and 36") if not num: return '0' while currentnum: mod = currentnum % base currentnum = currentnum // base # 修正条件为 mod >=10 converted_string = chr(48 + mod + 7*(mod >= 10)) + converted_string return converted_string number='a126' oldbase=12 newbase=14 print(base10toN(base_encode(number,oldbase),newbase))
验证结果
运行修改后的代码,输出结果为650A,和你的预期完全一致。
如果需要输出小写字母(比如650a),可以把字符计算部分改成chr(48 + mod + 39*(mod >= 10)),不过你的需求是大写字母,当前修改就足够了。
内容的提问来源于stack exchange,提问作者Yashaswini Ravi
相关产品推荐
相关产品推荐

