一尘不染

支持的Swift String格式说明符是什么?

swift

在Swift中,我可以使用格式说明符来格式化字符串:

// This will return "0.120"
String(format: "%.03f", 0.12)

但是官方文档没有提供有关受支持的格式说明符或如何构建类似于以下内容的模板的任何信息或链接"%.03f"https
:
//developer.apple.com/documentation/swift/string/3126742-init

它只说:

返回一个String对象,该对象通过使用给定的格式字符串作为模板进行初始化,剩余的参数值将替换为该对象。


阅读 243

收藏
2020-07-07

共1个答案

一尘不染

StringSwift中用于格式化的格式说明符与Objective-C
格式中的说明符相同NSString,其本身与格式相同,CFString并且深埋在Apple文档的档案中(两个页面的内容相同,均来自2002年或更早):

但是此文档页面本身并不完整,例如未提及 标志精度 说明符和 宽度 说明符。实际上,它声称遵循IEEE
printf规范(第6期,2004版)
,该规范本身与ISO
C标准保持一致。因此,那些符应该与我们所拥有的以C printf,与另外的%@说明符Objective-
C对象,并添加记录不完整的%D%U%O符和q长度修改。


说明符

每个转换规范都由’%’字符或字符序列“%n $”引入。

n 是参数的索引,例如:

String(format: "%2$@ %1$@", "world", "Hello")

格式说明符

%@ Objective-C对象,打印为descriptionWithLocale:返回的字符串(如果有),否则为描述。

实际上,您可能还使用了某些Swift类型,但是必须在标准库中定义它们才能符合CVarArg协议,并且我认为它们需要支持桥接到Objective-
C对象:https//developer.apple。
com / documentation / foundation / object_runtime /
classes_bridged_to_swift_standard_library_value_types

String(format: "%@", ["Hello", "world"])

%%’%’字符。

String(format: "100%% %@", true.description)

%d,%i有符号32位整数(int)。

String(format: "from %d to %d", Int32.min, Int32.max)

%u,%U,%D无符号32位整数(无符号int)。

String(format: "from %u to %u", UInt32.min, UInt32.max)

%x无符号32位整数(无符号int),使用数字0–9和小写a–f以十六进制打印。

String(format: "from %x to %x", UInt32.min, UInt32.max)

%X无符号的32位整数(无符号的int),使用数字0–9和大写的A–F以十六进制打印。

String(format: "from %X to %X", UInt32.min, UInt32.max)

%o,%O无符号32位整数(无符号int),以八进制打印。

String(format: "from %o to %o", UInt32.min, UInt32.max)

%f 64位浮点数(双精度),以十进制表示法打印。产生“ inf”,“ infinity”或“ nan”。

String(format: "from %f to %f", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

%F 64位浮点数(双精度),以十进制表示法打印。产生“ INF”,“ INFINITY”或“ NAN”。

String(format: "from %F to %F", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

%e 64位浮点数(双精度),以科学计数法打印,并使用小写字母e引入指数。

String(format: "from %e to %e", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

%E 64位浮点数(双精度),以科学计数法打印,并使用大写字母E引入指数。

String(format: "from %E to %E", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

%g 64位浮点数(双精度),如果指数小于–4或大于或等于精度,则以%e样式打印,否则以%f样式打印。

String(format: "from %g to %g", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

%G 64位浮点数(双精度),如果指数小于–4或大于或等于精度,则以%E样式打印,否则以%f样式打印。

String(format: "from %G to %G", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

%c 8位无符号字符(无符号字符)。

String(format: "from %c to %c", "a".utf8.first!, "z".utf8.first!)

%C 16位UTF-16代码单元(单字符)。

String(format: "from %C to %C", "爱".utf16.first!, "终".utf16.first!)

%s空终止的8位无符号字符数组。

"Hello world".withCString {
    String(format: "%s", $0)
}

%S空终止的16位UTF-16代码单元的数组。

"Hello world".withCString(encodedAs: UTF16.self) {
    String(format: "%S", $0)
}

%p无效指针(无效*),以十六进制打印,数字为0–9,小写字母a–f,前导0x。

var hello = "world"
withUnsafePointer(to: &hello) {
    String(format: "%p", $0)
}

%n参数应该是一个指向整数的指针,到目前为止,通过对fprintf()函数之一的调用,已将写入输出的字节数写入该整数。

n格式说明斯威夫特似乎不支持4+

%a一个64位浮点数(双精度),以科学计数法打印,在小数点前使用小写p引入指数,并在前导0x和小数点前有一个十六进制数字。

String(format: "from %a to %a", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

%一个64位浮点数(双精度),以科学计数法打印,在前导0X和小数点前有一个十六进制数字,并使用大写P来引入指数。

String(format: "from %A to %A", Double.leastNonzeroMagnitude, Double.greatestFiniteMagnitude)

标志

‘十进制转换结果的整数部分(%i,%d,%u,%f,%F,%g或%G)应使用成千上万个分组字符进行格式化。对于其他转换,行为是不确定的。使用非货币分组字符。

' Swift 4+中似乎不支持该标志

-转换结果应在字段内左对齐。如果未指定此标志,则转换为右对齐。

String(format: "from %-12f to %-12d.", Double.leastNonzeroMagnitude, Int32.max)

+带符号转换的结果应始终以符号(’+’或’-‘)开头。如果未指定此标志,则仅当转换为负值时,转换才应以符号开始。

String(format: "from %+f to %+d", Double.leastNonzeroMagnitude, Int32.max)

如果已签名转换的第一个字符不是符号,或者如果已签名转换未产生任何字符,则结果前应加上。这意味着,如果同时出现和’+’标志,则将忽略标志。

String(format: "from % d to % d.", Int32.min, Int32.max)

#指定将值转换为替代形式。对于o转换,它提高了精度(如有必要),可以将结果的第一位强制为零。对于x或X转换说明符,非零结果的前缀应为0x(或0X)。对于a,A,e,E,f,F,g和G转换说明符,即使没有数字跟在基数字符后,结果也应始终包含基数字符。如果没有此标志,则仅当在其后面跟随一个数字时,基数字符才会出现在这些转换的结果中。对于g和G转换说明符,尾随零通常不会从结果中删除。对于其他转换说明符,该行为是未定义的。

String(format: "from %#a to %#x.", Double.leastNonzeroMagnitude, UInt32.max)

0对于d,i,o,u,x,X,a,A,e,E,f,F,g和G转换说明符,前导零(在任何符号或基数指示之后)用于填充到场宽 不执行空格填充。如果同时出现“
0”和“-”标志,则忽略“ 0”标志。对于d,i,o,u,x和X转换说明符,如果指定了精度,则将忽略‘0’标志。如果同时出现“
0”和“”标志,则分组字符将在零填充之前插入。对于其他转换,其行为是不确定的。

String(format: "from %012f to %012d.", Double.leastNonzeroMagnitude, Int32.max)

宽度修改器

如果转换后的值的字节数少于字段宽度,则默认情况下应在其左侧填充空格;如果对字段宽度设置了左调整标志(’-‘),则应在右边进行填充。字段宽度采用星号(’*’)或十进制整数的形式。

String(format: "from %12f to %*d.", Double.leastNonzeroMagnitude, 12, Int32.max)

精度修饰符

可选精度,它给出d,i,o,u,x和X转换说明符出现的最小位数;a,A,e,E,f和F转换说明符的基数字符后出现的位数;g和G转换说明符的最大有效位数;或从s和S转换说明符中的字符串打印的最大字节数。精度采用句点(’。’)的形式,后跟星号(’*’)或可选的十进制数字字符串,其中空数字字符串被视为零。如果精度与任何其他转换说明符一起出现,则行为未定义。

String(format: "from %.12f to %.*d.", Double.leastNonzeroMagnitude, 12, Int32.max)

长度修改器

h长度修饰符,指定后面的d,o,u,x或X转换说明符适用于short或无符号short参数。

String(format: "from %hd to %hu", CShort.min, CUnsignedShort.max)

hh长度修饰符,指定后面的d,o,u,x或X转换说明符适用于有符号char或无符号char参数。

String(format: "from %hhd to %hhu", CChar.min, CUnsignedChar.max)

l长度修饰符,指定后面的d,o,u,x或X转换说明符适用于long或无符号long参数。

String(format: "from %ld to %lu", CLong.min, CUnsignedLong.max)

ll,q长度修饰符,指定后面的d,o,u,x或X转换说明符适用于long long或无符号long long参数。

String(format: "from %lld to %llu", CLongLong.min, CUnsignedLongLong.max)

L长度修饰符,指定后面的a,A,e,E,f,F,g或G转换说明符适用于long double参数。

format 在Swift 4+中,我无法将CLongDouble参数传递给

z长度修饰符,指定后面的d,o,u,x或X转换说明符适用于size_t。

String(format: "from %zd to %zu", size_t.min, size_t.max)

t长度修饰符,指定后面的d,o,u,x或X转换说明符应用于ptrdiff_t。

String(format: "from %td to %tu", ptrdiff_t.min, ptrdiff_t.max)

j长度修饰符,指定后面的d,o,u,x或X转换说明符应用于intmax_t或uintmax_t参数。

String(format: "from %jd to %ju", intmax_t.min, uintmax_t.max)
2020-07-07