我正在尝试生成一个如下所示的字符串:
echo json_encode(array(
'error' => array(
'text' => $e->getMessage()
)
));
其中姓名和电话号码不同,需要插入,电话号码应对齐。在本例中,我使用了以下模板:
Nadya's Cell: (415) 123-4567
Jim's Cell: (617) 123-4567
我不想手动添加空格,而是希望字符串的总宽度适应name1 = "Nadya"
name2 = "Jim"
phone_number1 = "(415) 123-4567"
phone_number2 = "(617) 123-4567"
string = "{name1}'s Cell: {phone_number1}\n{name2}'s Cell: {phone_number2}".format(**locals())
和name1
中最长的。
到目前为止,我已经能够提出以下https://docs.python.org/3.6/library/string.html以下内容:
name2
产生
max_length = max(len(name1), len(name2))
# This should use max_length and contain "'s Cell:"
string = "{name1:<7}{phone_number1}\n{name2:<7}{phone_number2}".format(**locals())
print(string)
问题是总宽度Nadya (415) 123-4567
Jim (617) 123-4567
仍然硬编码到模板中,我看不到如何在名称后添加7
,因为这会在名字和撇号。任何想法如何解决这个问题?
答案 0 :(得分:3)
您可以使用嵌套格式说明符,这是一个经常被忽视的功能:
max_length = max(len(name1), len(name2)) + 2
string = """{name1:<{max_length}}{phone_number1}
{name2:<{max_length}}{phone_number2}""".format(**locals())
print(string)
# output:
# Nadya (415) 123-4567
# Jim (617) 123-4567
documentation只提到他们,这可能解释了为什么他们相对不为人知:
format_spec字段还可以包含嵌套的替换字段 它。这些嵌套的替换字段可能包含字段名称, 转换标志和格式规范,但更深的嵌套不是 允许。 format_spec中的替换字段被替换 在解释format_spec字符串之前。这允许 格式化要动态指定的值。
答案 1 :(得分:0)
以下是https://www.python.org/dev/peps/pep-0498/#format-specifiers之后使用f-strings的另一种解决方案:
name1 += "'s Cell:"
name2 += "'s Cell:"
max_length = max(len(name1), len(name2))
string = f"{name1:{max_length+2}}{phone_number1}\n{name2:{max_length+2}}{phone_number2}"
print(string)
产生
Nadya's Cell: (415) 123-4567
Jim's Cell: (617) 123-4567
根据需要。