Python 正在尝试将浮点字符串从基数x转换为基数10

Python 正在尝试将浮点字符串从基数x转换为基数10,python,Python,我正在尝试将字符串从任何基数(2-36)转换为基数10。字符串将包含一个分数。在下面的代码中,我尝试使用int()转换。我是否需要循环遍历字符串中的每个字符,并根据位置值逐个转换 迄今为止的代码和结果: def is_valid_strfrac(s, base=2): return all([is_valid_strdigit(c, base) for c in s if c != '.']) \ and (len([c for c in s if c == '.']

我正在尝试将字符串从任何基数(2-36)转换为基数10。字符串将包含一个分数。在下面的代码中,我尝试使用int()转换。我是否需要循环遍历字符串中的每个字符,并根据位置值逐个转换

迄今为止的代码和结果:

def is_valid_strfrac(s, base=2):

    return all([is_valid_strdigit(c, base) for c in s if c != '.']) \

        and (len([c for c in s if c == '.']) <= 1)



def eval_strfrac(s, base=2):

    assert is_valid_strfrac(s, base), "'{}' contains invalid digits for a base-{} number.".format(s, base)

    int(s, base)



print("start")    

print(eval_strfrac('100.101', 2))

print("end")
def是有效的\u strfrac(s,base=2):
返回全部([如果c!='.'',则s中的c的strdigit(c,base)是否有效])\
和(len([c表示s中的c,如果c='.])11打印(eval_strfrac('100.101',2))
12打印(“结束”)
评估中的strfrac(s,基地)
6#数字=“0123456789abcdefghijklmnopqrstuvwxyz”
7#返回和(数字。索引(x)*基**i代表i,枚举中的x(s[:-1]))
---->8整数(s,基数)
9
10打印(“开始”)
ValueError:基为2的int()的文本无效:“100.101”
修改以显示有效标准:
def是有效的\u strdigit(c,base=2):
如果类型(c)不是str:返回False#拒绝非字符串数字
如果(type(base)不是int)或(base<2)或(base>36):返回False#拒绝2-36之外的非整数基
如果碱基<2或碱基>36:返回False#拒绝2-36以外的碱基
如果len(c)!=1:返回False#拒绝任何非单个字符的内容

如果“0”,则可以执行以下操作从字符串中检索整数部分和小数部分:

s=“100.101”#假设s作为有效字符串有效
x=2#源库
#查找整数部分和小数部分
零件=s.split('。)
如果len(零件)==2:
整数部分,小数部分=部分[0],部分[1]
elif len(零件)=1:
如果s中的“.”
整数部分,小数部分=”,部分[0]
其他:
整数部分,小数部分=部分[0],“”
其他:
引发异常(“无效数字”)
还可以使用正则表达式将字符串拆分为整数部分和小数部分:

重新导入
s=“100.101”#假设s作为有效字符串有效
x=2#源库
m=重新搜索(“(?P\d*)\。(?P\d*)”,s)
整数部分,小数部分=m.group(“整数”),m.group(“小数”)
然后对整数和小数字符串中的字符进行迭代,将数字相加:

#迭代整数和小数部分以求和
结果=和([(x**i)*int(c)表示枚举中的i,c(整数部分[:-1]))+和([(x**-(i+1))*int(c)表示枚举中的i,c(小数部分)])
打印(结果)#打印4.625

'100.101'='100101/1000'(仍在base2中)

你可以通过像那样“扩展”你的数字,转换两个部分(100101->37,1000->8)并进行除法,得到相同的结果

让我们这样做:

base = 2
s = "100.101"
separated = s.split(".")
merged = "".join(separated)
dot_position = len(separated[1]) if len(separated) > 1 else 0
divisor = base ** dot_position
converted = int(merged, base=base) / divisor

你能给我看一下strdigit的代码吗?您还可以包括预期的输出吗?您希望的
eval\u strfrac
输出是什么?对于
100.101
,应该输出什么。我认为您确实需要对字符串进行迭代。好吧,既然您已经将这两部分分开了,您可以使用
int
和base进行转换,而不是手动求和,至少对于整数部分是这样。实际上,我已还原,因为int函数不喜欢空字符串。对于空字符串,您可以将分隔部分更改为使用“0”而不是“.”;P应该在任何基地工作,因为基地是如何工作的如果数字以点(无整数部分)开头,例如,
“.101”
,则分隔的是
[”“,“101”],因此它正确合并
merge`并且
dot\u位置也正确计算。如果数字只有整数,
split
什么也不做,
merged
s
相同,三元运算符使
dot_position=0
,因此我们除以1。
def is_valid_strdigit(c, base=2):
    if type (c) is not str: return False # Reject non-string digits
    if (type (base) is not int) or (base < 2) or (base > 36): return False # Reject non-integer bases outside 2-36
    if base < 2 or base > 36: return False # Reject bases outside 2-36
    if len (c) != 1: return False # Reject anything that is not a single character
    if '0' <= c <= str (min (base-1, 9)): return True # Numerical digits for bases up to 10
    if base > 10 and 0 <= ord (c) - ord ('a') < base-10: return True # Letter digits for bases > 10
    return False # Reject everything else
base = 2
s = "100.101"
separated = s.split(".")
merged = "".join(separated)
dot_position = len(separated[1]) if len(separated) > 1 else 0
divisor = base ** dot_position
converted = int(merged, base=base) / divisor