不使用.format()格式化带逗号的大整数

时间:2019-06-23 01:12:47

标签: python

我正在尝试通过不使用format()的末尾每3个数字插入','来格式化任何数字

  

123456789变为123,456,789

     

1000000变成1,000,000

到目前为止,我似乎只是从一开始就做过,我尝试了不同的想法来扭转它,但它们似乎并没有我希望的那样。

def format_number(number):
    s = [x for x in str(number)]

    for a in s[::3]:
        if s.index(a) is not 0:
             s.insert(s.index(a), ',')
    return ''.join(s)

print(format_number(1123456789))

>> 112,345,678,9

但是显然我想要的是1,123,456,789

我尝试反转范围[:-1:3],但得到112,345,6789

说明:我不想使用格式来构造数字,我宁愿只是为了自学而自己理解如何做。

3 个答案:

答案 0 :(得分:2)

这是不使用内置功能的解决方案:

def format_number(number):
    s = list(str(number))[::-1]
    o = ''
    for a in range(len(s)):
        if a and a % 3 == 0:
            o += ','
        o += s[a]
    return o[::-1]


print(format_number(1123456789))

这是使用内置函数的相同解决方案:

def format_number(number):
    return '{:,}'.format(number)


print(format_number(1123456789))

我希望这会有所帮助。 :D

答案 1 :(得分:2)

一种完全不需要内置功能的方式...

def format_number(number):
    i = 0
    r = ""
    while True:
        r = "0123456789"[number % 10] + r
        number //= 10
        if number == 0:
            return r
        i += 1
        if i % 3 == 0:
            r = "," + r

这是一个几乎没有内置功能或方法的版本(仍然必须使用str

def format_number(number):
    i = 0
    r = ""
    for character in str(number)[::-1]:
        if i > 0 and i % 3 == 0:
            r = "," + r
        r = character + r
        i += 1

    return r

在没有format的情况下使用其他内置方法的另一种方法是将数字取反,将其分成3个块,用逗号将它们连接起来,然后再次取反。

def format_number(number):
    backward = str(number)[::-1]
    r = ",".join(backward[i:i+3] for i in range(0, len(backward), 3))
    return r[::-1]

答案 2 :(得分:1)

您当前的方法存在以下缺点

  • 在大多数情况下(尤其是对于int),应使用== / !=运算符而不是is / is not运算符检查是否相等/不相等,
  • 使用list.index从左端返回第一个出现的位置(因此,s.index('1')在您的示例中将始终为0),如果索引被代替,我们可以遍历范围(使用{{3} })。

我们可以有类似的东西

def format_number(number):
    s = [x for x in str(number)]
    for index in range(len(s) - 3, 0, -3):
        s.insert(index, ',')
    return ''.join(s)

测试

>>> format_number(1123456789)
'1,123,456,789'
>>> format_number(6789)
'6,789'
>>> format_number(135)
'135'

如果不允许rangelist.insertstr.join

我们可以替换

  • rangewhile循环,
  • list.insert使用切片和串联,
  • str.join并置,

喜欢

def format_number(number):
    s = [x for x in str(number)]
    index = len(s) - 3
    while index > 0:
        s = s[:index] + [','] + s[index:]
        index -= 3
    result = ''
    for character in s:
        result += character
    return result

使用str.format

最后,跟随range built-in

  

','选项表示使用逗号分隔千位分隔符。对于可识别语言环境的分隔符,请改用'n'整数表示类型。

您的功能可以简化为

def format_number(number):
    return '{:,}'.format(number)

它甚至可以用于float s。