Swift数字格式

use*_*074 9 formatting numbers swift

我刚刚开始了解Swift,但我在极端基本级别的数字格式问题上存在严重问题.

例如,我需要显示一个至少有2位数的整数(例如00,01,02,03,04,05 ......).我期望的正常语法是这样的:

println("%02i%02i%02i",var1,var2,var3);

...但我没有找到任何有关如何在Swift中实现此目的的明确指示.我发现很难相信我需要创建一个自定义函数来做到这一点.将float或double值返回到固定的小数位数相同.

我发现了几个类似问题的链接(Swift中的精确字符串格式说明符以及如何在Swift 中使用println来格式化数字)但它们似乎混合了目标C甚至谈论Python和使用统一库.这种基本编程需求没有Swift解决方案吗?在Swift中完全忽略了一些如此根本的东西,这是真的吗?

Ant*_*nio 12

您可以使用此构造函数构造具有类c格式的字符串:

String(format: String, arguments:[CVarArgType])
Run Code Online (Sandbox Code Playgroud)

样品用法:

var x = 10

println(String(format: "%04d", arguments: [x])) // This will print "0010"
Run Code Online (Sandbox Code Playgroud)

如果您要使用它很多,并且想要一个更紧凑的表单,您可以实现这样的扩展:

extension String {
    func format(arguments: [CVarArgType]) -> String {
        return String(format: self, arguments: arguments)
    }
}
Run Code Online (Sandbox Code Playgroud)

允许简化其用法,如下例所示:

"%d apples cost $%03.2f".format([4, 4 * 0.33])
Run Code Online (Sandbox Code Playgroud)


RM3*_*545 6

这是该问题的 POP 解决方案:

protocol Formattable {
    func format(pattern: String) -> String
}
extension Formattable where Self: CVarArg {
    func format(pattern: String) -> String {
        return String(format: pattern, arguments: [self])
    }
}
extension Int: Formattable { }
extension Double: Formattable { }
extension Float: Formattable { }

let myInt = 10
let myDouble: Double = 0.01
let myFloat: Float = 1.11

print(myInt.format(pattern: "%04d"))      // "0010
print(myDouble.format(pattern: "%.2f"))   // "0.01"
print(myFloat.format(pattern: "$%03.2f")) // "$1.11"
print(100.format(pattern: "%05d"))        // "00100"
Run Code Online (Sandbox Code Playgroud)