2014-10-02 21 views
8

Sto appena iniziando a conoscere Swift, ma sto avendo un problema serio con la formattazione dei numeri ad un livello estremamente semplice.Formattazione numero rapido

Ad esempio, ho bisogno di visualizzare un numero intero con almeno 2 cifre (ad esempio 00, 01, 02, 03, 04, 05 ...). La sintassi normale che mi aspetterei sarebbe qualcosa di simile:

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

... ma non trovo alcuna istruzione chiara su come ottenere ciò in Swift. Trovo davvero difficile credere che sia necessario creare una funzione personalizzata per farlo. Lo stesso per restituire un valore float o doppio a un numero fisso di cifre decimali.

ho trovato i link a un paio di domande simili (Precision String Format Specifier In Swift & How to use println in Swift to format number) ma sembrano mescolare obiettivo C e anche parlare di Python e l'utilizzo di librerie di unità. Non esiste una soluzione rapida per questa esigenza di programmazione di base? È proprio vero che qualcosa di così fondamentale è stato completamente trascurato in Swift?

risposta

11

È possibile costruire una stringa con una formattazione c-come l'utilizzo di questo costruttore:

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

utilizzo Esempio:

var x = 10 

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

Se avete intenzione di usarlo molto, e vogliono un forma più compatta, è possibile implementare un'estensione come questa:

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

che consente di semplificare il suo utilizzo come in questo esempio:

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

O semplicemente 'println (String (formato: "% 04D", x))' ... –

+1

Grazie @MartinR, che è molto meglio :) - Aggiunta una forma ancora più breve utilizzando un'estensione. – Antonio

+1

Grazie mille a tutti e due. Dopo aver letto pagine e pagine di discussione intorno a questo, è bello avere una soluzione chiara e concisa. – user3535074

0

È comunque possibile utilizzare buona ole NSLog ("% 2f", myFloatOrDouble) troppo: D

1

Ecco una soluzione POP al problema:

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'è una soluzione semplice che ho imparato con "Noi < 3 Swift", che è così facile che puoi anche usare senza Foundation, round() o Stringhe, mantenendo il valore numerico.

Esempio:

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

risultato: 31,726