String.Format

本文详细介绍了String.Format()方法的使用技巧,包括索引、对齐和格式字符串等关键概念。展示了如何通过复合格式字符串实现数值的多种格式展示,并提供了转义大括号的正确方法。此外,还给出了对齐组件在格式设置中的应用实例。

String.Format()复合格式设置:

格式项语法: { 索引[,对齐][:格式字符串]}

索引组件
强制“索引”组件(也叫参数说明符)是一个从 0 开始的数字,可标识对象列表中对应的项。 也就是说,参数说明符为 0 的格式项列表中的第一个对象,参数说明符为 1 的格式项列表中的第二个对象,依次类推。

通过指定相同的参数说明符,多个格式项可以引用对象列表中的同一个元素。例如,通过指定类似于“{0:X} {0:E} {0:N}”的复合格式字符串,可以将同一个数值设置为十六进制、科学记数法和数字格式。

每个格式项都可以引用列表中的任一对象。例如,如果有三个对象,则可以通过指定类似于“{1} {0} {2}”的复合格式字符串来设置第二、第一和第三个对象的格式。格式项未引用的对象会被忽略。如果参数说明符指定了超出对象列表范围的项,将导致运行时异常。

对齐组件
可选的“对齐”组件是一个带符号的整数,指示首选的设置了格式的字段宽度。 如果“对齐”值小于设置了格式的字符串的长度,“对齐”会被忽略,并且使用设置了格式的字符串的长度作为字段宽度。 如果“对齐”为正数,字段中设置了格式的数据为右对齐;如果“对齐”为负数,字段中的设置了格式的数据为左对齐。 如果需要填充,则使用空白。如果指定“对齐”,就需要使用逗号。

格式字符串组件
可选的“格式字符串”组件是适合正在设置格式的对象类型的格式字符串。 如果相应对象是数值,则指定数字格式字符串,如果相应对象是 DateTime 对象,则指定日期和时间格式字符串,或者如果相应对象是枚举值,则指定枚举格式字符串。如果不指定“格式字符串”,则对数字、日期和时间或者枚举类型使用常规(“G”)格式说明符。 如果指定“格式说明符”,需要使用冒号。

转义大括号
左大括号和右大括号被解释为格式项的开始和结束。因此,必须使用转义序列显示文本左大括号或右大括号。在固定文本中指定两个左大括号 ("{{") 以显示一个左大括号 ("{"),或指定两个右大括号 ("}}") 以显示一个右大括号 ("}")。按照在格式项中遇到大括号的顺序依次解释它们。不支持解释嵌套的大括号。

解释转义大括号的方式会导致意外的结果。例如,考虑要显示一个左大括号、一个设置为十进制数格式的数值和一个右大括号的格式项“{{{0:D}}}”。但是,实际是按照以下方式解释该格式项:

前两个左大括号 ("{{") 被转义,生成一个左大括号。

之后的三个字符 ("{0:") 被解释为格式项的开始。

下一个字符 ("D") 将被解释为 Decimal 标准数值格式说明符,但后面的两个转义大括号 ("}}") 生成单个大括号。由于得到的字符串 ("D}") 不是标准数值格式说明符号,所以得到的字符串会被解释为用于显示字符串“D}”的自定义格式字符串。

最后一个大括号 ("}") 被解释为格式项的结束。

显示的最终结果是字符串“{D}”。不会显示本来要设置格式的数值。

在编写代码时,避免错误解释转义大括号和格式项的一种方法是单独设置大括号和格式项的格式。也就是说,在第一个格式设置操作中显示文本左大括号,在下一操作中显示格式项的结果,然后在最后一个操作中显示文本右大括号。

处理顺序
如果要设置格式的值是 null,则返回空字符串 ("")。

如果要设置格式的类型实现了 ICustomFormatter 接口,则调用 ICustomFormatter.Format 方法。

如果上一步未为类型设置格式,并且该类型实现了 IFormattable 接口,则调用 IFormattable.ToString 方法。

如果上一步未为类型设置格式,则调用该类型的 ToString 方法(从 Object 类继承而来)。

前面的步骤执行完毕之后应用对齐。

下列示例说明了对齐在格式设置中的使用。设置了格式的的参数放置在竖线字符 (|) 之间以突出显示得到的对齐。

string myFName = "Fred";
string myLName = "Opals";
int myInt = 100;
string FormatFName = String.Format("First Name = |{0,10}|", myFName);
string FormatLName = String.Format("Last Name = |{0,10}|", myLName);
string FormatPrice = String.Format("Price = |{0,10:C}|", myInt);
Console.WriteLine(FormatFName);
Console.WriteLine(FormatLName);
Console.WriteLine(FormatPrice);

FormatFName = String.Format("First Name = |{0,-10}|", myFName);
FormatLName = String.Format("Last Name = |{0,-10}|", myLName);
FormatPrice = String.Format("Price = |{0,-10:C}|", myInt);
Console.WriteLine(FormatFName);
Console.WriteLine(FormatLName);
Console.WriteLine(FormatPrice);

显示结果:
First Name = |          Fred|
Last Name = |         Opals|
Price = |           $100.00|
First Name = |Fred      |
Last Name = |Opals     |
Price = |$100.00   | 

<think>我们正在讨论Lua的string.format函数。根据引用,我们知道这个函数用于格式化字符串,比使用".."操作符连接字符串在某些情况下更灵活和可读,尤其是当需要特定格式转换(如十六进制、补零等)时。 函数定义: string.format(formatstring, ...) 第一个参数是格式字符串,包含占位符(如%d, %s等),后续参数用于替换这些占位符。 常用占位符: %d - 整数 %f - 浮点数 %s - 字符串 %x - 十六进制(小写字母) %X - 十六进制(大写字母) %% - 百分号本身 特殊格式控制(以%d为例): %02d - 表示整数至少显示两位,不足两位在前面补0 %-3d - 表示左对齐,宽度为3,不足用空格填充 示例: 1. 整数补零:string.format("%02d", 1) -> "01" 2.对齐string.format("%-3d", 22) -> "22 "(后面有一个空格) 虽然string.format在性能上可能比".."稍差(因为它调用了C函数),但在复杂格式化时提高了可读性。 下面我们通过一些示例来详细说明用法。</think>### Lua `string.format` 字符串格式化详解 `string.format()` 是 Lua 中用于格式化字符串的核心函数,特别适合处理复杂格式或需要特定转换的场景。相比简单的 `..` 连接操作,它提供更强大的格式化能力[^1][^2]。 #### 基本语法 ```lua local result = string.format(format_string, arg1, arg2, ...) ``` - **format_string**:包含占位符的格式字符串 - **arg1, arg2...**:替换占位符的实际值 #### 常用占位符 | 占位符 | 说明 | 示例 | 输出结果 | |--------|---------------------|--------------------------|----------------| | `%d` | 十进制整数 | `string.format("%d", 25)`| `"25"` | | `%f` | 浮点数 | `string.format("%.2f", math.pi)` | `"3.14"` | | `%s` | 字符串 | `string.format("Hello %s", "Lua")` | `"Hello Lua"` | | `%x` | 十六进制(小写) | `string.format("%x", 255)` | `"ff"` | | `%X` | 十六进制(大写) | `string.format("%X", 255)` | `"FF"` | | `%%` | 百分号本身 | `string.format("50%% off")` | `"50% off"` | #### 高级格式控制 1. **数字补零**(固定位数显示): ```lua print(string.format("ID: %03d", 7)) -- ID: 007 print(string.format("Hex: %04X", 15)) -- Hex: 000F ``` 2. **对齐控制**: ```lua -- 左对齐(宽度10) print(string.format("|%-10s|", "Lua")) -- |Lua | -- 右对齐(宽度10) print(string.format("|%10s|", "Lua")) -- | Lua| ``` 3. **浮点数精度**: ```lua print(string.format("Pi: %.4f", math.pi)) -- Pi: 3.1416 print(string.format("Ratio: %.1f%%", 85.32)) -- Ratio: 85.3% ``` 4. **多参数组合**: ```lua local name, age = "Alice", 30 local msg = string.format("%s is %d years old (%02d/%02d)", name, age, 5, 3) -- Alice is 30 years old (05/03) ``` #### 性能注意事项 虽然 `string.format()` 比 `..` 连接操作性能稍低(底层调用 C 函数 `str_format`)[^3],但在以下场景仍推荐使用: - 需要数字格式化(补零、十六进制转换等) - 长字符串拼接(提高可读性) - 需要精确控制输出格式时 ```mermaid graph LR A[字符串格式化需求] --> B{简单拼接?} B -->|是| C[使用 .. 操作符] B -->|否| D{需要特殊格式?} D -->|是| E[使用 string.format] D -->|否| F[考虑 table.concat] ``` #### 实际应用示例 ```lua -- 表格数据格式化输出 local data = { { "Apple", 2.49, 10 }, { "Banana", 1.29, 25 }, { "Orange", 3.99, 8 } } for _, item in ipairs(data) do print(string.format("| %-10s | $%5.2f | %03d |", item[1], item[2], item[3])) end -- 输出: -- | Apple | $ 2.49 | 010 | -- | Banana | $ 1.29 | 025 | -- | Orange | $ 3.99 | 008 | ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值