有时您可能需要输出具有特定格式的数字,例如将值 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
指示该方法使用总共 6 个字符来输出该值。
然后,.2
表示小数点后要包含的小数位数,在本例中为 2,通常用于指定货币值。
最后,参数 f
表示 Lua 的“转换说明符”,在本例中为浮点数,其大多数行为与 C/C++ printf 函数族中的转换说明符相同。
在上面的示例中,该数字仅占用了分配的 6 个字符中的 5 个,因此字符串用空格填充。默认情况下,空格将添加到左侧以模拟右对齐,因为数字通常是右对齐的。但是,当输出字母值(如名称)时,您通常希望它们是标准(左)对齐的。要实现这一点,只需在格式代码中使用减号 (-
):
string.format( "%-20s %-10d.", "Albert Einstein", "29314" )
如果我们输出此代码,它将显示如下:
Albert Einstein 29314 .
在此输出中,仔细观察“占位符”空格。因为我们为字符串指定了 20 个总位置Albert Einstein
-
号将其左对齐,所以在输出字符串的下一部分 (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 需求等任务。要实现您想要的确切格式可能需要一些实验,但经过一些测试,您几乎可以以任何必要的方式格式化字符串。