2014-10-02 28 views
8

Tôi chỉ mới bắt đầu biết Swift nhưng tôi gặp vấn đề nghiêm trọng với định dạng số ở mức cực kỳ cơ bản. Ví dụ: Tôi cần hiển thị một số nguyên có ít nhất 2 chữ số (ví dụ: 00, 01, 02, 03, 04, 05 ...). Cú pháp bình thường mà tôi mong đợi sẽ giống như sau:Định dạng số Swift

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

... nhưng tôi không tìm thấy bất kỳ hướng dẫn rõ ràng nào về cách đạt được điều này trong Swift. Tôi thấy thật khó để tin rằng tôi cần phải tạo ra một chức năng tùy chỉnh để làm điều đó. Điều tương tự cho việc trả về một giá trị float hoặc double thành một số thập phân cố định.

Tôi đã tìm thấy liên kết đến một số câu hỏi tương tự (Precision String Format Specifier In Swift & How to use println in Swift to format number) nhưng dường như kết hợp mục tiêu C và thậm chí nói về Python và sử dụng thư viện thống nhất. Không có giải pháp Swift nào cho nhu cầu lập trình cơ bản này? Có thực sự là một điều gì đó rất cơ bản đã bị bỏ qua hoàn toàn trong Swift?

Trả lời

11

Bạn có thể xây dựng một chuỗi với một định dạng c-như sử dụng constructor này:

String(format: String, arguments:[CVarArgType]) 

sử dụng mẫu:

var x = 10 

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

Nếu bạn đang đi để sử dụng nó rất nhiều, và muốn có một hình thức nhỏ gọn hơn, bạn có thể triển khai tiện ích mở rộng như thế này:

extension String { 
    func format(arguments: [CVarArgType]) -> String { 
     return String(format: self, arguments: arguments) 
    } 
} 

cho phép đơn giản hóa việc sử dụng nó như trong ví dụ này:

"%d apples cost $%03.2f".format([4, 4 * 0.33]) 
+4

Hoặc chỉ cần 'println (String (định dạng: "% 04d", x)) '... –

+1

Cảm ơn @MartinR, đó là tốt hơn nhiều :) - thêm một hình thức ngắn hơn bằng cách sử dụng phần mở rộng. – Antonio

+1

Cảm ơn bạn rất nhiều. Sau khi đọc các trang và các trang thảo luận về điều này, tuyệt vời của nó để có một giải pháp rõ ràng, súc tích. – user3535074

0

Bạn vẫn có thể sử dụng tốt ole NSLog ("% 2f", myFloatOrDouble) quá: D

1

Dưới đây là một giải pháp POP cho vấn đề:

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" 
1

Có một giải pháp đơn giản tôi đã học được với "Chúng tôi < 3 Swift", điều này rất dễ dàng, thậm chí bạn có thể sử dụng mà không có Foundation, round() hoặc Strings, giữ giá trị số.

Ví dụ:

var number = 31.726354765 
var intNumber = Int(number * 1000.0) 
var roundedNumber = Double(intNumber)/1000.0 

kết quả: 31,726

Các vấn đề liên quan