试图制作一个特殊的计数器

2024-03-29 12:54:01 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,我试图创建一个product_ID生成器,它接受任意值的数字,并将其转换为十六进制格式的“#AA0000”。当4个数字溢出超过9999时,它们将ASCII大写字母集中的第一个字母增加1。也就是说,如果我输入10000,我会得到#AB0001

目前,我正在使用模运算符(%)查找输入数字的剩余部分,因此它始终在4位以内。(作为参考,我使用的公式是Numb%9999。)

我目前遇到的问题是如何正确增加第二个字母。我已经设法使一个单字母版本工作,您可以在这里看到:

from string import ascii_uppercase as upper
upper = [a for a in upper]

def Convert_Numb_To_Ref(Order_Number):
    """Takes an Order_Number (int), and converts it into a unique Order_ID"""
    Number = str((Order_Number%9999)+1) # Makes it so it never is bigger than 4 digits
    Number = ("0"*(4-len(str(Number))))+Number # If number < 1000, adds on 0s to the beginning, so 1 -> 0001
    try:
        Letter = upper[Order_Number//9999] # Divides and floors
    except IndexError:
        print("Number too large! Cannot generate Product_ID")
        return False
    return f"#{Letter}{Number}"

如果我输入10000,我会得到#B0002

这很好,返回我想看到的。(目前上述代码只适用于一个字母,这就是为什么没有2个字母的原因。)我只需要增加第二个字母


Tags: andidnumberreturnso格式字母order
1条回答
网友
1楼 · 发布于 2024-03-29 12:54:01

问题出在这一行:

Letter = upper[Order_Number//9999] # Divides and floors

如果订单号过大,索引将大于25,因此您将得到一个IndexError。为了避免这种情况,您应该使用“模26”来获得一个小于26的数字。你应该再查找下一个字母(左边的那个)

其他一些评论:

  • 要分开高位部分和低位部分,不应除以9999,而应除以10000(模块操作的idem),除非要跳过数字9999(或0000)。你的问题并不完全清楚这一点
  • 对于可以使用标准Python格式的数字:'%04d' % nr就可以了

把它放在一起,你可以这样写:

import string


def number_to_reference(order_number):
    """Take an order number and convert it into a unique order id."""
    if order_number >= 26 * 26 * 10000:
        print("Number too large! Cannot generate Product_ID")
        return False
        # NB: You could also do the following instead:
        # raise ValueError('Number too large! Cannot generate Product_ID')

    high_part = order_number // 10000
    low_part = order_number % 10000

    letter1 = string.ascii_uppercase[high_part // 26]
    letter2 = string.ascii_uppercase[high_part % 26]
    return '#%s%s%04d' % (letter1, letter2, low_part)


print(number_to_reference(1))        # AA0001
print(number_to_reference(123))      # AA0123
print(number_to_reference(9999))     # AA9999
print(number_to_reference(10000))    # AB0000
print(number_to_reference(1234567))  # ET4567
print(number_to_reference(6759999))  # ZZ9999
print(number_to_reference(6760000))  # Number too large! Cannot generate Product_ID

相关问题 更多 >