在Erlang中使用前导零设置格式

在Erlang中使用前导零设置格式,erlang,string-formatting,Erlang,String Formatting,我希望以字符串形式返回本地时间,但要使用前导零。我试过这个: {{Year, Month, Day}, {Hour, Minute, Second}} = erlang:localtime(). DateAsString = io_lib:format("~2.10.0B~2.10.0B~4.10.0B~2.10.0B~2.10.0B~2.10.0B", [Month, Day, Year, Hour, Minute, Second]). 但如果某些组件为一位数字,则返

我希望以字符串形式返回本地时间,但要使用前导零。我试过这个:

{{Year, Month, Day}, {Hour, Minute, Second}} = erlang:localtime().
DateAsString = io_lib:format("~2.10.0B~2.10.0B~4.10.0B~2.10.0B~2.10.0B~2.10.0B", 
           [Month, Day, Year, Hour, Minute, Second]).
但如果某些组件为一位数字,则返回的字符串为:

[["0",57],"29","2011","17","33","34"]
当前月份
9
打印为
[“0”,57]

请帮忙

谢谢。

试试:

1> lists:flatten([["0",57],"29","2011","17","33","34"]).
"09292011173334"

io\u lib:format/2
(它的同伴
io:format/2
)实际上返回一个深度io列表。这样的列表是可打印的,可以通过套接字发送,也可以像平面字符串一样写入文件,但生成起来更有效。展平通常是无用的,因为在所有情况下,如果字符串将被打印或输出到文件/套接字,它将被Erlang自动展平。

您希望使用如下方式:

DateAsString = io_lib:format("~2..0w~2..0w~4..0w~2..0w~2..0w~2..0w", 
       [Month, Day, Year, Hour, Minute, Second]).

更常见的
w
format修饰符在这里做的事情是正确的,比如base等等,因此不需要使用更复杂的
B
修饰符
2..0
说“2个字符宽,零填充,没有指定精度。”我们这里不需要精度,因为我们处理的是整数。

谢谢您的回复。
~2..0w
实际上返回相同的结果。谢谢。展平列表将返回正确的字符串。我使用当前时间构建文件名。我只想知道这个
[“0”,57]
是从哪里来的?再次感谢。57是“9”的ASCII码。扁平化只是将格式化的返回值强制为单个字符串,因此整个过程都被解释为ASCII。记住,在Erlang中,普通字符串只是整数数组。
erl
环境必须猜测您希望如何解释给定的整数数组。在你的情况下,它碰巧猜错了,但实际上,它也在做同样的事情。太好了。感谢您的解释。对Adam伟大的答案的一个澄清是io:format(“~s”,[DateAsString])打印的正是您想要的内容。(也可以尝试io:format(“~s”,[[“0”,57]])以查看从io的角度来看,“09”和[“0”,57]是相同的。)