【问题标题】:Convert string to decimal (base 10) in Python在 Python 中将字符串转换为十进制(以 10 为底)
【发布时间】:2013-07-02 11:45:04
【问题描述】:

我尝试创建一个简单的方法将字符串转换为以 10 为底的整数(在 Python 中):

def strToNum(strData, num=0 ,numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
    return ((len(strData)==0) and num) or (strToNum(strData[0:-1], num+numerals.index(strData[-1])**len(strData)))

它似乎不起作用。当我将“test”作为它输出的字符串进行测试时:729458。而当我使用一些在线工具进行转换时,我得到了:1372205

【问题讨论】:

  • 定义“似乎不起作用”。
  • 请添加一些示例输入和预期输出,因为不清楚您要在这里做什么。
  • 添加了请求的输出。
  • @agam360 解释一下你的方法,你想在这里做什么?
  • @AshwiniChaudhary,“将字符串(基数为 36 - 我希望)转换为基数为 10 的整数”

标签: python numbers converter base


【解决方案1】:

如果您的输入是 UTF-8,您可以将每个字节编码为 Base10,而不是将自己限制为某些固定的数字集。然后挑战变成了解码。一些基于 Web 的 Base10 编码器用空格分隔每个编码的字符/字节。我选择用一个可以修剪掉的空字符左填充。

我相信这里还有很大的优化空间,但是这两个函数很适合我的需求:

编码:

def base10Encode(inputString):
    stringAsBytes = bytes(inputString, "utf-8")
    stringAsBase10 = ""
    for byte in stringAsBytes:
        byteStr = str(byte).rjust(3, '\0') # Pad left with null to aide decoding
        stringAsBase10 += byteStr
    return stringAsBase10

解码:

def base10Decode(inputString):
    base10Blocks = []
    for i in range(0, len(inputString), 3):
        base10Blocks.append(inputString[i:i+3])
    decodedBytes = bytearray(len(base10Blocks))
    for i, block in enumerate(base10Blocks):
        blockStr = block.replace('\0', '')
        decodedBytes[i] = int(blockStr)
    return decodedBytes.decode("utf-8")

【讨论】:

    【解决方案2】:

    您可以在这里简单地使用int

    >>> strs = 'test'
    >>> int(strs, 36)
    1372205
    

    或者定义你自己的函数:

    def func(strs):
        numerals = "0123456789abcdefghijklmnopqrstuvwxyz"
        return sum(numerals.index(x)*36**i for i, x in enumerate(strs[::-1]))
    ... 
    >>> func(strs)
    1372205
    

    【讨论】:

    • 是否有类似的逆解法?
    【解决方案3】:

    试试这个:

    def convert(string: str) -> int:
        for base in range(0, 36):
            try:
                if str(int(string, base)) == string:
                    return int(string, base)
                    break
            except ValueError:
                pass
            finally:
                pass
    

    【讨论】:

      猜你喜欢
      • 2020-10-04
      • 2022-12-07
      • 1970-01-01
      • 2014-04-23
      • 2012-03-14
      • 2014-11-07
      • 2020-06-20
      • 2019-02-10
      • 2014-03-07
      相关资源
      最近更新 更多