2011-09-29 57 views
2

我想返回當前時間爲字符串,但前導零。我嘗試這樣做:Erlang中前導零的格式

{{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]

請幫助。

謝謝。

回答

6

嘗試:

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

io_lib:format/2(和它的同伴io:format/2)實際上返回了深刻的IO列表。這樣的列表是可打印的,可以在套接字上發送,也可以像平面字符串一樣寫入文件,但生成效率更高。扁平化通常是無用的,因爲在所有將字符串打印或輸出到文件/套接字的情況下,Erlang會自動將其扁平化。

+0

謝謝。展平列表將返回正確的字符串。我使用當前時間來建立一個文件名。我只是想知道這個'['0','57]'從哪裏來?再次感謝。 –

+1

57是「9」的ASCII碼。拼合只是強制格式化的返回值爲單個字符串,因此整個事物被解釋爲ASCII。請記住,在Erlang中,普通字符串只是整數數組。 'erl'環境必須猜測你想要給定一個給定的整數數組。它恰好在你的案例中猜到了錯誤,但實際上,它也在做同樣的事情。 –

+0

太好了。感謝您的解釋。 –

3

你想使用這樣的事:

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

比較常見的w格式修改做正確的事在這裏,用鹼和這樣的東西,所以沒有必要使用更復雜的B修改。 2..0表示「2個字符寬,零填充,沒有指定精度」。我們不需要精確度,因爲我們正在處理整數。

+0

感謝答覆。 '〜2..0w'實際上返回相同的結果。 –