Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Python3中可排序的数字格式化为字符串?_Python_Python 3.x_String Formatting - Fatal编程技术网

如何将Python3中可排序的数字格式化为字符串?

如何将Python3中可排序的数字格式化为字符串?,python,python-3.x,string-formatting,Python,Python 3.x,String Formatting,我想用Python3将数字(int,float)转换成字符串。如果我对字符串进行字母数字排序,结果也应该是正确的。这是愿望清单: 1=>“001” 10=>“010” 100=>“100” 5.6=>“005.6” 我可以确保数字小于1000。如果有帮助,我还可以保证小数点后最多有一位数字 我可以编写一个函数来实现这一点。但是,这也可以通过.format()magic实现吗?如果需要处理浮点值,则最好在对十进制值进行分区后使用: def pad_number(num): num =

我想用Python3将数字(int,float)转换成字符串。如果我对字符串进行字母数字排序,结果也应该是正确的。这是愿望清单:

  • 1
    =>
    “001”
  • 10
    =>
    “010”
  • 100
    =>
    “100”
  • 5.6
    =>
    “005.6”
我可以确保数字小于1000。如果有帮助,我还可以保证小数点后最多有一位数字


我可以编写一个函数来实现这一点。但是,这也可以通过
.format()
magic实现吗?

如果需要处理浮点值,则最好在对十进制值进行分区后使用:

def pad_number(num):
    num = str(num).partition('.')
    return ''.join((num[0].zfill(3),) + num[1:])
这里给出了一个由3个元素组成的元组,如果没有小数点,则后两个元素为空。这使我们有机会将数字的整数部分归零

如果您不需要处理浮点值,那么
format()
将是一个非常好的工具:

format(intnum, '03d')
但这会截断浮点值,对于浮点数,您必须使用不同格式的字符串,该字符串随需要包含的小数数而变化

演示:


您也可以打开
类型
intead,例如:

for i in (1, 10, 100, 5.6): 
    print(format(i, {float: '05.1f', int: '03'}[type(i)]))
结果:

001
010
100
005.6
运行此命令将生成以下输出:

Aligned numbers:
 00000
 00001
 003.1
-003.1
 00010
 00100
-00001
 999.9
 234.3
-099.0
-999.9
-999.9
['-999.9', '-999.9', '-099.0', '-003.1', '-00001', ' 00000', ' 00001', ' 003.1', ' 00010', ' 00100', ' 234.3', ' 999.9']

浮点数是否应如此处理?这让这一切有点。。更棘手的是,更长的数字会发生什么?小数点后有更多位数的浮点数会发生什么情况?还有。。。您希望将它们作为字符串进行数字排序的原因是什么。。。您通常会在一个足够大的字段中正确对齐它们,以容纳它们的
str
/
repr
值,并将其作为文本排序……负数呢?还是像6.023E23这样的非常大的数字?我澄清了关于数字附加限制的问题。不知怎的,这在编辑中丢失了(它曾经在那里…),问题主要是你不知道要包含多少小数。例如,您可以使用
05g
而不是
05.1f
,但是如果您想格式化
5.75
该怎么办?通过使用
str()
而不是,我可以独立格式化整个数字部分。@Martijn确实。。。如果需要的话。。。给定示例输入/输出-这可能是必需的,也可能不是必需的,这就是此答案的基础:)。。。思考
123.456
甚至
1234.567
from math import trunc
from math import log10

def pad_number_sequence(seq, prec=1):
    """Convert a sequence of numbers to a list of zero-padded strings.

    The number of decimals in the converted floats is controlled by prec.

    Depending on the size of the numbers in the sequence the width
    will be dynamically calculated so that the resulting string
    representation will align.
    """
    digits_left_of_decimal = trunc(log10(max(abs(x) for x in seq))) + 1
    width = digits_left_of_decimal + prec + 2  # 1 decimal point, 1 sign
    num2str = { float: "{number:0= {width}.{prec}f}",
                int: "{number:0= {width}}", }
    return [num2str[type(n)].format(number=n, prec=prec, width=width) 
            for n in seq]


# Example use.
lnum = [0, 1, 3.1415, -3.1415, 10, 100, -1, 999.9, 234.32, -98.99, -999.9, -999.9]
print('Aligned numbers:')
for s in pad_number_sequence(lnum):
    print(s)

# Sorting is best done by adding a sorting key.
print(sorted(pad_number_sequence(lnum), key=lambda x: float(x)))
Aligned numbers:
 00000
 00001
 003.1
-003.1
 00010
 00100
-00001
 999.9
 234.3
-099.0
-999.9
-999.9
['-999.9', '-999.9', '-099.0', '-003.1', '-00001', ' 00000', ' 00001', ' 003.1', ' 00010', ' 00100', ' 234.3', ' 999.9']