标量与数组:整数、浮点、布尔、日期时间、数组
基于 TOML 1.0.0 · 核于 2026-07
速查
- 整数:64 位有符号;可带
+/-;下划线分隔(1_000,两侧须紧邻数字);进制前缀0x/0o/0b(0xDEADBEEF/0o755/0b1101)。 - ⚠️ 整数禁前导零:
0123非法(0本身除外);进制形式不允许+/-。 - 浮点:IEEE 754 双精度;带小数点或指数(
3.14、5e+22、6.626e-34);下划线分隔。 - ⚠️ 浮点小数点两侧都要有数字:
.7、7.、3.e+20全非法,须写0.7、7.0、3.0e+20。 - 特殊浮点:
inf/+inf/-inf/nan,必须全小写(Inf/NaN/Infinity非法)。 - 布尔:只有
true/false,全小写;True/yes/1都不是布尔。 - 日期时间四型(RFC 3339,原生类型):
- 带偏移日期时间
1979-05-27T07:32:00Z(或-07:00)——绝对时刻。 - 本地日期时间
1979-05-27T07:32:00——无时区。 - 本地日期
1979-05-27。 - 本地时间
07:32:00。 T可用空格替代:1979-05-27 07:32:00Z;小数秒至少支持毫秒,超精度截断。
- 带偏移日期时间
- 数组
[ ]:有序、逗号分隔;1.0.0 允许混合类型;可跨行;允许尾随逗号;可含注释。 - ⚠️ 尾随逗号:数组允许(
[1, 2,]),内联表禁止({ a = 1, }非法)。
一、整数
整数是 64 位有符号数,可带正负号:
int1 = +99
int2 = 42
int3 = -17下划线可作可读性分隔(解析时忽略),但每个下划线两侧都必须紧邻数字:
int5 = 1_000 # = 1000
int6 = 5_349_221 # = 5349221
# _1000 / 1000_ / 1__000 都非法支持三种非十进制前缀(这些形式不允许 +/-,前缀与数字间不能加下划线):
hex1 = 0xDEADBEEF # 十六进制,字母大小写均可
oct1 = 0o755 # 八进制(Unix 权限位常用)
bin1 = 0b11010110 # 二进制禁止前导零
num = 0123 非法。TOML 禁止十进制整数带前导零(单独一个 0 除外),以消除「前导零是否代表八进制」的歧义——要八进制必须显式写 0o 前缀。
二、浮点
浮点遵循 IEEE 754 双精度(binary64),由整数部分 + 可选小数部分 + 可选指数构成:
flt1 = +1.0
flt2 = 3.1415
flt3 = -0.01
flt4 = 5e+22
flt5 = 6.626e-34
flt6 = 224_617.445_991_228 # 也支持下划线小数点两侧都要有数字
.7、7.、3.e+20 全部非法——小数点前后都必须至少有一位数字,须写成 0.7、7.0、3.0e+20。这条规则和 JSON 一致,都是为消除歧义。
特殊浮点值(必须全小写):
sf1 = inf # 正无穷
sf2 = +inf
sf3 = -inf # 负无穷
sf4 = nan # 非数(IEEE 754 NaN)
sf5 = +nanInf、Infinity、NaN 这些写法都非法——TOML 和布尔一样,刻意只保留小写字面量。
三、布尔
布尔值只有两个小写字面量:
bool1 = true
bool2 = falseTrue、TRUE、yes、on、1 都不是布尔(yes/on 是 YAML 的行为,TOML 刻意不这么做)。
四、日期时间:四种类型
TOML 内置四种日期时间类型(遵循 RFC 3339),都是原生类型、无需引号——这是它相对 JSON 的核心优势(JSON 只能拿字符串充当日期)。
# 1) 带偏移日期时间(Offset Date-Time):锚定一个全球绝对时刻
odt1 = 1979-05-27T07:32:00Z
odt2 = 1979-05-27T00:32:00-07:00
odt3 = 1979-05-27T00:32:00.999999-07:00
odt4 = 1979-05-27 07:32:00Z # T 可用空格替代
# 2) 本地日期时间(Local Date-Time):无时区,只是「墙上时钟读数」
ldt1 = 1979-05-27T07:32:00
ldt2 = 1979-05-27T00:32:00.999999
# 3) 本地日期(Local Date):只有日期
ld1 = 1979-05-27
# 4) 本地时间(Local Time):只有时间
lt1 = 07:32:00
lt2 = 00:32:00.999999关键区别:
- 带偏移 vs 本地:末尾带
Z或±hh:mm的是「带偏移日期时间」,对应一个明确的全球时刻;不带任何偏移的是「本地日期时间」,缺少时区信息,不对应唯一绝对时刻。二者语义不同,别混用。 - 小数秒:规范要求至少支持到毫秒精度;超出实现可表示精度时,多余小数位应**截断(truncate)**而非四舍五入。
五、数组
数组用方括号 [ ] 包裹、逗号分隔,元素有序:
integers = [1, 2, 3]
colors = ["red", "yellow", "green"]
nested = [[1, 2], [3, 4, 5]]1.0.0 允许混合类型(异构数组,早期草案曾要求同构):
mixed = [1, "two", 3.0, true]
contributors = ["Foo", { name = "Baz", email = "baz@example.com" }]数组可以跨行书写,并允许尾随逗号、中间可插注释——对版本控制的 diff 很友好:
numbers = [
1,
2, # 中间可以写注释
3, # 最后一项后允许尾随逗号
]尾随逗号:数组允许,内联表禁止
[1, 2,] 合法,但 { a = 1, b = 2, }(内联表末尾多一个逗号)非法。这是两者一个高频混淆点。内联表的更多限制见表·表数组·内联表。
标量和数组之后,进入 表·表数组·内联表:[table] 与子表、[[array]] 表数组、{ } 内联表,以及点分键与表头交互的那些经典陷阱。