我刚刚开始了解Swift,但我在极其基本的级别上遇到了严重的数字格式问题。
例如,我需要显示一个至少有2位数的整数(例如00,01,02,03,04,05 ......)。我期望的正常语法是:
println("%02i%02i%02i",var1,var2,var3);
...但我没有找到任何关于如何在Swift中实现这一目标的明确指示。我发现很难相信我需要创建一个自定义函数来做到这一点。将float或double值返回到固定的小数位数时也一样。
我找到了几个类似问题的链接(Precision String Format Specifier In Swift& How to use println in Swift to format number),但他们似乎混合了客观C,甚至谈论Python和使用统一库。这种基本编程需求没有Swift解决方案吗?在Swift中完全忽略了一些如此根本的东西,这是真的吗?
答案 0 :(得分:11)
您可以使用此构造函数构造具有类C格式的字符串:
String(format: String, arguments:[CVarArgType])
样本用法:
var x = 10
println(String(format: "%04d", arguments: [x])) // This will print "0010"
如果您要使用它很多,并且想要一个更紧凑的表单,您可以实现这样的扩展:
extension String {
func format(arguments: [CVarArgType]) -> String {
return String(format: self, arguments: arguments)
}
}
允许简化其用法,如下例所示:
"%d apples cost $%03.2f".format([4, 4 * 0.33])
答案 1 :(得分:1)
这是解决问题的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"
答案 2 :(得分:1)
我用“We< 3 Swift”学习了一个简单的解决方案,这很简单,你甚至可以在没有Foundation,round()或Strings的情况下使用,保持数值。
示例:
var number = 31.726354765
var intNumber = Int(number * 1000.0)
var roundedNumber = Double(intNumber) / 1000.0
结果:31.726
答案 3 :(得分:0)
你仍然可以使用好的NSLog("%。2f",myFloatOrDouble):D