String.format

本文详细介绍了 Java 中 String.format 方法的使用方法,包括格式化字符串、整数、浮点数和日期时间的具体语法及示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 1、String.format(String fmt,Object... objs)
 * fmt: 格式成什么样的格式
 * objs:需要格式化的目录对象支持数值、字符串、日期
 * 注意:jdk1.5及其以上版本才有此方法。
 * 
 * 2、fmt的编写方式
 * ①:常规、整数、浮点类型
 * %开始+引用的objs第几个值$(非必选)+0(不足位按0填充,非必选)+产生位数(如果格式化为浮点数则为“总位数.小数位数”,非必选)+类型修饰符
 * 如:%1$3d、%1$04d、%2$5.2f
 * ②:时间类型
 * %开始+引用的objs第几个值$(非必选)+时间前缀(t/T)+类型修饰符
 * 如:%1$tY、%1$tm、%1$td、%1$tH、%1$tM、%1$tS
 * 注意:如果不写第二部分(引用的objs第几个值$), 则默认按使用%开始的数量依次增加一(建议写上)。
 * 
 * 3、类型修饰符(摘自jdk)
 *   转换   参数类别 说明  
 * --------|----------|-----------------------------------
 * 'b', 'B'  常规   如果参数 arg 为 null,则结果为 "false"。如果 arg 是一个 boolean 值或 Boolean,则结果为 String.valueOf() 返回的字符串。否则结果为 "true"。  
 * 'h', 'H'  常规   如果参数 arg 为 null,则结果为 "null"。否则,结果为调用 Integer.toHexString(arg.hashCode()) 得到的结果。  
 * 's', 'S'  常规   如果参数 arg 为 null,则结果为 "null"。如果 arg 实现 Formattable,则调用 arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。  
 * 'c', 'C'  字符   结果是一个 Unicode 字符  
 * 'd'       整数 结果被格式化为十进制整数  
 * 'o'       整数   结果被格式化为八进制整数  
 * 'x', 'X'  整数 结果被格式化为十六进制整数  
 * 'e', 'E'  浮点 结果被格式化为用计算机科学记数法表示的十进制数  
 * 'f'        浮点 结果被格式化为十进制数  
 * 'g', 'G'  浮点   根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。  
 * 'a', 'A'  浮点   结果被格式化为带有效位数和指数的十六进制浮点数  
 * 't', 'T'  日期/时间   日期和时间转换字符的前缀。请参阅日期/时间转换。  
 * '%'     百分比   结果为字面值 '%' ('\u0025')  
 * 'n'      行分隔符   结果为特定于平台的行分隔符  
 * 
 * 4、时间类型修饰符(摘自jdk)
 * 修饰符 | 说明
 * ---------|-------------------------------------
 * 'H'   | 24 小时制的小时,被格式化为必要时带前导零的两位数,即 00 - 23。  
 * 'I'   | 12 小时制的小时,被格式化为必要时带前导零的两位数,即 01 - 12。  
 * 'k'   | 24 小时制的小时,即 0 - 23。  
 * 'l'   | 12 小时制的小时,即 1 - 12。  
 * 'M'   | 小时中的分钟,被格式化为必要时带前导零的两位数,即 00 - 59。  
 * 'S'   | 分钟中的秒,被格式化为必要时带前导零的两位数,即 00 - 60 ("60" 是支持闰秒所需的一个特殊值)。  
 * 'L'   | 秒中的毫秒,被格式化为必要时带前导零的三位数,即 000 - 999。  
 * 'N'   | 秒中的毫微秒,被格式化为必要时带前导零的九位数,即 000000000 - 999999999。  
 * 'p'   | 特定于语言环境的 上午或下午 标记以小写形式表示,例如 "am" 或 "pm"。使用转换前缀 'T' 可以强行将此输出转换为大写形式。  
 * 'z'   | 相对于 GMT 的 RFC 822 格式的数字时区偏移量,例如 -0800。  
 * 'Z'   | 表示时区缩写形式的字符串。Formatter 的语言环境将取代参数的语言环境(如果有)。  
 * 's'   | 自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的秒数,即 Long.MIN_VALUE/1000 与 Long.MAX_VALUE/1000 之间的差值。  
 * 'Q'   | 自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的毫秒数,即 Long.MIN_VALUE 与 Long.MAX_VALUE 之间的差值。  
 * 'B'   | 特定于语言环境的月份全称,例如 "January" 和 "February"。  
 * 'b'   | 特定于语言环境的月份简称,例如 "Jan" 和 "Feb"。  
 * 'h'   | 与 'b' 相同。  
 * 'A'   | 特定于语言环境的星期几全称,例如 "Sunday" 和 "Monday"  
 * 'a'   | 特定于语言环境的星期几简称,例如 "Sun" 和 "Mon"  
 * 'C'   | 除以 100 的四位数表示的年份,被格式化为必要时带前导零的两位数,即 00 - 99  
 * 'Y'   | 年份,被格式化为必要时带前导零的四位数(至少),例如,0092 等于格里高利历的 92 CE。  
 * 'y'   | 年份的最后两位数,被格式化为必要时带前导零的两位数,即 00 - 99。  
 * 'j'   | 一年中的天数,被格式化为必要时带前导零的三位数,例如,对于格里高利历是 001 - 366。  
 * 'm'   | 月份,被格式化为必要时带前导零的两位数,即 01 - 13。  
 * 'd'   | 一个月中的天数,被格式化为必要时带前导零两位数,即 01 - 31  
 * 'e'   | 一个月中的天数,被格式化为两位数,即 1 - 31。  
 * 
 * @author jianjun.wu
 * @createtime Jun 24, 2010 10:31:05 AM
 * @version 1.0
 * @see JDK1.5
 **/
public class TestString
{


/**
* @author jianjun.wu
* @creaetime Jun 24, 2010 10:31:06 AM
* @param args
*/
public static void main(String[] args)
{
Calendar c = Calendar.getInstance();
System.out.println(String.format("Duke's Birthday: %1$tm %1$te,%1$ty", c));
System.out.println(String.format("Now time is %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS:%1$tL:%1$tN:%1$tp:%1$tz:%1$tZ:%1$ts:%1$tQ", new Date()));
System.out.println(String.format("number:%1$08.1f--%2$s",5656565.26,"2"));
System.out.println(String.format("My name is %1$s.","zhangsan",23));
}
}
<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、付费专栏及课程。

余额充值