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

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

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

它只说:

返回通过使用给定格式字符串作为模板初始化的字符串对象,剩余的参数值将被替换到该模板中.

推荐答案

Swift中String种格式的格式说明符与Objective-C NSString格式的格式说明符相同,其本身与CFString种格式的格式说明符相同,并深深地埋藏在苹果文档的档案中(这两个页面的内容相同,最初都是2002年或更早的版本):

但是这个文档页面本身是不完整的,例如没有提到flagsprecisionwidth说明符.实际上,它声称遵循IEEE printf specifications (Issue 6, 2004 Edition),本身符合ISO C标准.因此,这些说明符应该与我们使用Cprintf时的说明符相同,添加了%@个Objective-C对象说明符,并添加了缺乏记录的%D%U%O说明符和q长度修饰符.


标志成分

每个转换规范都由"%"字符或字符序列"%n$"引入.

n是参数的索引,如:

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

Format 标志成分

%@    Objective-C object, printed as the string returned by descriptionWithLocale: if available, or description otherwise.

实际上,您也可以使用一些Swift类型,但它们必须在标准库中定义,以符合CVARRG协议,我相信它们需要支持桥接到Objective-C对象:https://developer.apple.com/documentation/foundation/object_runtime/classes_bridged_to_swift_standard_library_value_types.

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

%%    '%' character.

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

%d, %i    Signed 32-bit integer (int).

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

%u, %U, %D    Unsigned 32-bit integer (unsigned int).

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

%x    Unsigned 32-bit integer (unsigned int), printed in hexadecimal using the digits 0–9 and lowercase a–f.

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

%X    Unsigned 32-bit integer (unsigned int), printed in hexadecimal using the digits 0–9 and uppercase A–F.

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

%o, %O    Unsigned 32-bit integer (unsigned int), printed in octal.

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

%f    64-bit floating-point number (double), printed in decimal notation. Produces "inf", "infinity", or "nan".

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

%F    64-bit floating-point number (double), printed in decimal notation. Produces "INF", "INFINITY", or "NAN".

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

%e    64-bit floating-point number (double), printed in scientific notation using a lowercase e to introduce the exponent.

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

%E    64-bit floating-point number (double), printed in scientific notation using an uppercase E to introduce the exponent.

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

%g    64-bit floating-point number (double), printed in the style of %e if the exponent is less than –4 or greater than or equal to the precision, in the style of %f otherwise.

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

%G    64-bit floating-point number (double), printed in the style of %E if the exponent is less than –4 or greater than or equal to the precision, in the style of %f otherwise.

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

%c    8-bit unsigned character (unsigned char).

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

%C    16-bit UTF-16 code unit (unichar).

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

%s    Null-terminated array of 8-bit unsigned characters.

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

%S    Null-terminated array of 16-bit UTF-16 code units.

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

%p    Void pointer (void *), printed in hexadecimal with the digits 0–9 and lowercase a–f, with a leading 0x.

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

%n    The argument shall be a pointer to an integer into which is written the number of bytes written to the output so far by this call to one of the fprintf() functions.

The 100 format specifier seems unsupported in Swift 4+

%a    64-bit floating-point number (double), printed in scientific notation with a leading 0x and one hexadecimal digit before the decimal point using a lowercase p to introduce the exponent.

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

%A    64-bit floating-point number (double), printed in scientific notation with a leading 0X and one hexadecimal digit before the decimal point using a uppercase P to introduce the exponent.

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

旗帜

'    The integer portion of the result of a decimal conversion ( %i, %d, %u, %f, %F, %g, or %G ) shall be formatted with thousands' grouping characters. For other conversions the behavior is undefined. The non-monetary grouping character is used.

The 100 flag seems unsupported in Swift 4+

-    The result of the conversion shall be left-justified within the field. The conversion is right-justified if this flag is not specified.

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

+    The result of a signed conversion shall always begin with a sign ( '+' or '-' ). The conversion shall begin with a sign only when a negative value is converted if this flag is not specified.

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

<space>    If the first character of a signed conversion is not a sign or if a signed conversion results in no characters, a <space> shall be prefixed to the result. This means that if the <space> and '+' flags both appear, the <space> flag shall be ignored.

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

#    Specifies that the value is to be converted to an alternative form. For o conversion, it increases the precision (if necessary) to force the first digit of the result to be zero. For x or X conversion specifiers, a non-zero result shall have 0x (or 0X) prefixed to it. For a, A, e, E, f, F, g , and G conversion specifiers, the result shall always contain a radix character, even if no digits follow the radix character. Without this flag, a radix character appears in the result of these conversions only if a digit follows it. For g and G conversion specifiers, trailing zeros shall not be removed from the result as they normally are. For other conversion specifiers, the behavior is undefined.

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

0    For d, i, o, u, x, X, a, A, e, E, f, F, g, and G conversion specifiers, leading zeros (following any indication of sign or base) are used to pad to the field width; no space padding is performed. If the '0' and '-' flags both appear, the '0' flag is ignored. For d, i, o, u, x, and X conversion specifiers, if a precision is specified, the '0' flag is ignored. If the '0' and '" flags both appear, the grouping characters are inserted before zero padding. For other conversions, the behavior is undefined.

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    Length modifier specifying that a following d, o, u, x, or X conversion specifier applies to a short or unsigned short argument.

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

hh    Length modifier specifying that a following d, o, u, x, or X conversion specifier applies to a signed char or unsigned char argument.

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

l    Length modifier specifying that a following d, o, u, x, or X conversion specifier applies to a long or unsigned long argument.

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

ll, q    长度修饰符 specifying that a following d, o, u, x, or X conversion specifier applies to a long long or unsigned long long argument.

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

L    Length modifier specifying that a following a, A, e, E, f, F, g, or G conversion specifier applies to a long double argument.

I wasn't able to pass a CLongDouble argument to 100 in Swift 4+

z    Length modifier specifying that a following d, o, u, x, or X conversion specifier applies to a size_t.

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

t    Length modifier specifying that a following d, o, u, x, or X conversion specifier applies to a ptrdiff_t.

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

j    Length modifier specifying that a following d, o, u, x, or X conversion specifier applies to a intmax_t or uintmax_t argument.

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

Swift相关问答推荐

如何将泛型函数存储到变量中?

如何访问用户选定目录下的(只读)文件?

按下一步后无法让文本字段切换焦点

SwiftUI同心圆,通过逐渐出现来显示进度

是否可以将具有关联值的枚举强制转换为其类型与关联值匹配的变量?

如何在SwiftUI中做出适当的曲线?

如何偏移HStack中的视图,但仍然约束框架以与偏移匹配?

如何通过 Enum 属性使用新的 #Predicate 宏获取

ToolbarItem 包含在动画中但不应该包含在动画中

有没有一种方法可以访问封闭实例ObservableObject以从属性包装器中的任何位置调用objectWillChange.send()

Swift Combine:如何在保留发布者结果顺序的同时进行收集?

如何在 switch case 模式语句中使用 Swift 文字正则表达式?

如何更改 Picker 的边框 colored颜色

阻止其他类型的键盘

FCM 后台通知在 iOS 中不起作用

我可以在 Swift 中为泛型类型 T 分配默认类型吗?

使用 Swift 在 iOS 8 中为应用程序图标添加徽章

Swift if 语句 - 多个条件用逗号分隔?

强制打开已在同一行代码中 Select 性访问的变量是否安全?

键盘显示时Tableview滚动内容