Voici comment j'aurais précédemment tronqué un flotteur à deux décimales
NSLog(@" %.02f %.02f %.02f", r, g, b);
J'ai vérifié les documents et le livre électronique, mais je n'ai pas pu le comprendre. Merci!
Ma meilleure solution jusqu'à présent, suite à la réponse de David :
import Foundation
extension Int {
func format(f: String) -> String {
return String(format: "%\(f)d", self)
}
}
extension Double {
func format(f: String) -> String {
return String(format: "%\(f)f", self)
}
}
let someInt = 4, someIntFormat = "03"
println("The integer number \(someInt) formatted with \"\(someIntFormat)\" looks like \(someInt.format(someIntFormat))")
// The integer number 4 formatted with "03" looks like 004
let someDouble = 3.14159265359, someDoubleFormat = ".3"
println("The floating point number \(someDouble) formatted with \"\(someDoubleFormat)\" looks like \(someDouble.format(someDoubleFormat))")
// The floating point number 3.14159265359 formatted with ".3" looks like 3.142
Je pense que c'est la solution la plus proche de Swift, liant les opérations de formatage directement au type de données. Il se pourrait bien qu'il y ait une bibliothèque intégrée d'opérations de formatage quelque part, ou peut-être qu'elle sera bientôt publiée. Gardez à l'esprit que la langue est toujours en version bêta.
un moyen simple est:
la source
println(String(format: "a float number: %.5f", 1.0321))
printf
sans avoir à écrire des extensions distinctes.import Foundation
J'ai trouvé que ça
String.localizedStringWithFormat
fonctionnait assez bien:Exemple:
la source
C'est un moyen très rapide et simple qui n'a pas besoin de solution complexe.
la source
Col 16: 'init' has been renamed to 'init(describing:)'
La plupart des réponses ici sont valables. Toutefois, si vous formatez souvent le nombre, envisagez d'étendre la classe Float pour ajouter une méthode qui renvoie une chaîne formatée. Voir l'exemple de code ci-dessous. Celui-ci atteint le même objectif en utilisant un formateur et une extension de nombre.
La console affiche:
Mise à jour SWIFT 3.1
la source
NSNumberFormatter
, comme cette réponse. Les autres réponses très votées ne reflètent tout simplement pas les paramètres régionaux du périphérique (par exemple, dans certains pays, ils utilisent une virgule pour une décimale; cela reflète cela; d'autres réponses ne le font pas).NSNumberFormatter
est assez lente à initialiser. Si possible, cela aide à en définir un et à le réutiliser. Cela dit, je lis ici cette question parce que ce n'est pas possible dans mon cas.Vous ne pouvez pas (encore) le faire avec une interpolation de chaîne. Votre meilleur pari sera toujours le formatage NSString:
En extrapolant à partir de python, il semble qu'une syntaxe raisonnable puisse être:
Ce qui vous permet ensuite de les utiliser comme:
Vous pouvez définir des opérateurs similaires pour tous les types numériques, malheureusement je n'ai pas trouvé de moyen de le faire avec des génériques.
Mise à jour Swift 5
À partir d'au moins Swift 5,
String
prend directement en charge l'format:
initialiseur, il n'est donc pas nécessaire d'utiliserNSString
et l'@infix
attribut n'est plus nécessaire, ce qui signifie que les exemples ci-dessus doivent être écrits comme suit:la source
[NSString stringWithFormat...
Pourquoi rendre cela si compliqué? Vous pouvez utiliser ceci à la place:
Voyez-le fonctionner dans Playground.
PS: Solution de: http://rrike.sh/xcode/rounding-various-decimal-places-swift/
la source
Usage
la source
Une solution plus élégante et générique consiste à réécrire l'
%
opérateur ruby / python :la source
"Hello %@, This is pi : %.2f" % ["World", M_PI]
ça marche, mais étrangement"%@ %@" % ["Hello", "World"]
augmentercan't unsafeBitCast
... Je suppose que cela sera corrigé dans la prochaine version.,
n'est pas un opérateur de caractères valide, dans Swift et dans la plupart des langues. Et imo, il est préférable d'utiliser un%
opérateur qui existe déjà dans d'autres langues. Voir developer.apple.com/library/ios/documentation/Swift/Conceptual/…Swift 4
la source
Vous pouvez toujours utiliser NSLog dans Swift comme dans Objective-C juste sans le signe @.
Edit: Après avoir travaillé avec Swift depuis un moment, je voudrais ajouter également cette variation
Production:
la source
Détails
Solution 1
func arrondi () -> Double
func arrondi (règle _: FloatingPointRoundingRule) -> Double
fonction mutante ronde ()
mutation func round (règle _: FloatingPointRoundingRule)
Solution 2
Usage
Échantillon complet
Production
la source
la source
Les réponses données jusqu'ici qui ont reçu le plus de votes reposent sur les méthodes NSString et vont exiger que vous ayez importé Foundation.
Cela dit, vous avez toujours accès à NSLog.
Je pense donc que la réponse à la question, si vous demandez comment continuer à utiliser NSLog dans Swift, est simplement:
import Foundation
la source
la source
ici une solution rapide "pure"
la source
Pouvoir d'extension
Sortie: La vitesse est de 12,3
la source
manière moins de frappe:
la source
Vous pouvez également créer un opérateur de cette manière
la source
Aussi avec arrondi:
la source
utiliser la méthode ci-dessous
la source
Une version de l'opérateur ruby / python% de Vincent Guerci, mise à jour pour Swift 2.1:
la source
Beaucoup de bonnes réponses ci-dessus, mais parfois un modèle est plus approprié que le genre de charabia "% .3f". Voici mon point de vue en utilisant un NumberFormatter dans Swift 3.
Ici, je voulais que 2 décimales soient toujours affichées, mais la troisième seulement si elle n'était pas nulle.
la source
Mise à jour de Swift 4 Xcode 10
la source
Qu'en est-il des extensions sur les types Double et CGFloat:
Usage:
tirages: 112 465 848 348 508,46
la source
la source
Je ne connais pas deux décimales, mais voici comment imprimer des flottants avec zéro décimale, alors j'imagine que ça peut être 2, 3, ... (Remarque: vous devez convertir CGFloat en Double pour passer à String (format :) ou il verra une valeur de zéro)
la source
Exemple Swift2: largeur d'écran d'un appareil iOS formatant le flottant en supprimant la décimale
la source
@Christian Dietrich:
au lieu de:
cela pourrait aussi être:
[correction:] Désolé pour la confusion * - Bien sûr, cela fonctionne avec les doubles. Je pense que, plus pratique (si vous voulez que les chiffres soient arrondis, pas coupés), ce serait quelque chose comme ça:
Pour Float uniquement, remplacez simplement Double par Float, pow avec powf et round avec roundf.
Mise à jour: j'ai trouvé qu'il est plus pratique d'utiliser le type de retour Double au lieu de String. Il en va de même pour la sortie String, c'est-à-dire:
imprime: Pi est à peu près 3,142.
Vous pouvez donc l'utiliser de la même manière pour les chaînes (vous pouvez même toujours écrire: println (d ~> 2)), mais en plus, vous pouvez également l'utiliser pour arrondir directement les valeurs, à savoir:
ou tout ce dont vous avez besoin…
la source
utilisation
ou
la source