2014-10-02 6 views
8

jestem dopiero zaczyna poznawać Swift ale mam poważny problem z formatowaniem liczba na poziomie bardzo podstawowym.Swift liczba formatowania

Na przykład, trzeba wyświetlić liczbę całkowitą co najmniej 2 cyfr (na przykład 00, 01, 02, 03, 04, 05 ...). Normalna składnia, której oczekiwałbym, byłaby podobna:

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

... ale nie znaleźliśmy żadnych jasnych instrukcji dla jak to osiągnąć w Swift. Naprawdę ciężko mi uwierzyć, że muszę stworzyć niestandardową funkcję do tego. To samo dotyczy zwracania wartości zmiennoprzecinkowej lub podwójnej do ustalonej liczby miejsc dziesiętnych.

Znalazłem linki do kilku podobnych pytań (Precision String Format Specifier In Swift & How to use println in Swift to format number), ale wydają się łączyć cel C, a nawet mówić o Pythonie i korzystaniu z bibliotek jedności. Czy nie ma rozwiązania Swift do tej podstawowej potrzeby programowania? Czy to prawda, że ​​coś tak fundamentalnego zostało całkowicie pominięte w Swift?

Odpowiedz

11

Można skonstruować ciąg z formatowaniem C-jak za pomocą tego konstruktora:

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

wykorzystanie próbki:

var x = 10 

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

Jeśli masz zamiar użyć go dużo, i chcesz bardziej zwarta forma, można zaimplementować rozszerzenie takie jak to:

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

pozwalające uprościć jego użycie, jak w Ten przykład:

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

Albo po prostu 'println (String (format: "% 04d", x))' ... –

+1

Dzięki @MartinR, że o wiele lepiej :) - dodano jeszcze krótszą formę przy użyciu rozszerzenia. – Antonio

+1

Wielkie dzięki dla was obojga. Po przeczytaniu stron i stron dyskusji na ten temat, świetnie jest mieć jasne, zwięzłe rozwiązanie. – user3535074

0

Można nadal używać dobrej ole NSLog ("% 2f" myFloatOrDouble) too: D

1

Oto rozwiązanie POP problemu:

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

istnieje proste rozwiązanie, którego nauczyłem się przy pomocy "We < 3 Swift", które jest tak łatwe, że można z niego korzystać bez Foundation, round() lub String, zachowując wartość liczbową.

Przykład:

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

wynikiem: 31,726