格式化字符串值

有时您可能需要输出具有特定格式的数字,例如将值 3.1415926 显示为仅保留两位小数。或者,您可能需要布置表格并生成列数据,例如排行榜。这时就需要用到 string.format()。使用此函数,您可以提供一个格式字符串以及一系列要格式化的值,API 将返回一个根据您的规范格式化的字符串。

格式化基础

格式字符串string.format() 的第一个参数)可以包含文本和格式代码,这些代码将生成所需的输出字符串。让我们看一个简单的例子:

string.format( "Bill made $%6.2f dollars at the yard sale.", 11.25017 )

在格式字符串中,请注意格式代码 %6.2f。这与第二个参数 11.25017 直接对应,如果我们将此代码输出到控制台,它将显示如下:

Bill made $ 11.25 dollars at the yard sale.

让我们更详细地研究格式代码 %6.2f

对齐和占位符

在上面的示例中,该数字仅占用了分配的 6 个字符中的 5 个,因此字符串用空格填充。默认情况下,空格将添加到左侧以模拟右对齐,因为数字通常是右对齐的。但是,当输出字母值(如名称)时,您通常希望它们是标准(左)对齐的。要实现这一点,只需在格式代码中使用减号 (-):

string.format( "%-20s %-10d.", "Albert Einstein", "29314" )

如果我们输出此代码,它将显示如下:

Albert Einstein     29314     .

在此输出中,仔细观察“占位符”空格。因为我们为字符串指定了 20 个总位置Albert Einstein(15 个字符),并使用 - 号将其对齐,所以在输出字符串的下一部分 (29314) 之前将输出 5 个占位符空格。同样,由于我们为字符串 29314 指定了 10 个总位置,所以在格式字符串的末尾 (.) 之前将输出 5 个占位符空格。.

前导零

string.format() API 也可用于格式化数字,例如高分,您可能希望在其中包含前导零:

string.format( "%07d", 1050 )

这将产生值 0001050,因为我们指定了 0(用前导零填充值),并且我们为格式化输出指定了 7 个总空格。

转换说明符

如上所述,您可以在格式字符串中使用各种“转换说明符”,包括:

说明符 输出
s 字符串
d 有符号十进制整数
f 十进制浮点数

基本上,除了一些例外,Lua 的 string.format() API 使用的参数与 C/C++ printf 函数族中的参数相同。

总结

如您所见,string.format() API 非常强大,可用于格式化字符串以进行文本显示或 UI 需求等任务。要实现您想要的确切格式可能需要一些实验,但经过一些测试,您几乎可以以任何必要的方式格式化字符串。