J'affiche une distance avec une décimale, et j'aimerais supprimer cette décimale au cas où elle serait égale à 0 (ex: 1200.0Km), comment pourrais-je faire cela rapidement? J'affiche ce numéro comme ceci:
let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: "%.1f", distanceFloat) + "Km"
Swift 3/4:
var distanceFloat1: Float = 5.0
var distanceFloat2: Float = 5.540
var distanceFloat3: Float = 5.03
extension Float {
var clean: String {
return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
}
}
print("Value \(distanceFloat1.clean)") // 5
print("Value \(distanceFloat2.clean)") // 5.54
print("Value \(distanceFloat3.clean)") // 5.03
Swift 2 (réponse originale)
let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: distanceFloat == floor(distanceFloat) ? “%.0f" : "%.1f", distanceFloat) + "Km"
Ou comme une extension:
extension Float {
var clean: String {
return self % 1 == 0 ? String(format: "%.0f", self) : String(self)
}
}
Utilisez NSNumberFormatter:
let formatter = NumberFormatter()
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 2
// Avoid not getting a zero on numbers lower than 1
// Eg: .5, .67, etc...
formatter.numberStyle = .decimal
let nums = [3.0, 5.1, 7.21, 9.311, 600.0, 0.5677, 0.6988]
for num in nums {
print(formatter.string(from: num as NSNumber) ?? "n/a")
}
Résultats:
3
5.1
7.21
9.31
600
0,57
0,7
extension
est le moyen puissant pour le faire.
Extension :
Code pour Swift 2 (pas Swift 3 ou plus récent)):
extension Float {
var cleanValue: String {
return self % 1 == 0 ? String(format: "%.0f", self) : String(self)
}
}
Utilisation :
var sampleValue: Float = 3.234
print(sampleValue.cleanValue)
3.234
sampleValue = 3.0
print(sampleValue.cleanValue)
3
sampleValue = 3
print(sampleValue.cleanValue)
3
Exemple de fichier Playground is here .
Mise à jour de la réponse acceptée pour Swift:
extension Float
{
var cleanValue: String
{
return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
}
}
l'utilisation serait simplement:
let someValue: Float = 3.0
print(someValue.cleanValue) //prints 3
Vous pouvez utiliser une extension comme déjà mentionné, cette solution est cependant un peu plus courte:
extension Float {
var shortValue: String {
return String(format: "%g", self)
}
}
Exemple d'utilisation:
var sample: Float = 3.234
print(sample.shortValue)
Dans Swift 4 essayez ceci.
extension CGFloat{
var cleanValue: String{
//return String(format: 1 == floor(self) ? "%.0f" : "%.2f", self)
return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(format: "%.2f", self)//
}
}
// Comment utiliser - si vous entrez plus de deux caractères après le point (.), Le dernier caractère est automatiquement tronqué et ne s'affiche que deux caractères après le point.
let strValue = "32.12"
print(\(CGFloat(strValue).cleanValue)
Pour le formater en chaîne, suivez ce modèle
let aFloat: Float = 1.123
let aString: String = String(format: "%.0f", aFloat) // "1"
let aString: String = String(format: "%.1f", aFloat) // "1.1"
let aString: String = String(format: "%.2f", aFloat) // "1.12"
let aString: String = String(format: "%.3f", aFloat) // "1.123"
Pour le formater à Int, suivez ce modèle
let aInt: Int = Int(aFloat) // "1"
NSNumberFormatter est votre ami
let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
let numberFormatter = NSNumberFormatter()
numberFormatter.positiveFormat = "###0.##"
let distance = numberFormatter.stringFromNumber(NSNumber(float: distanceFloat))!
distanceLabel.text = distance + " Km"
Voici le code complet.
let numberA: Float = 123.456
let numberB: Float = 789.000
func displayNumber(number: Float) {
if number - Float(Int(number)) == 0 {
println("\(Int(number))")
} else {
println("\(number)")
}
}
displayNumber(numberA) // console output: 123.456
displayNumber(numberB) // console output: 789
Voici la ligne la plus importante en profondeur.
func displayNumber(number: Float) {
Int(number)
.Float(Int(number))
.number - Float(Int(number))
if number - Float(Int(number)) == 0
Il n'est pas nécessaire d'expliquer le contenu des déclarations if et else.
Ce scénario est utile lorsqu'une précision de sortie personnalisée est souhaitée. Cette solution semble à peu près aussi rapide que NumberFormatter + NSNumber solution de MirekE , mais l’un des avantages pourrait être que nous évitons NSObject ici.
extension Double {
func string(maximumFractionDigits: Int = 2) -> String {
let s = String(format: "%.\(maximumFractionDigits)f", self)
var offset = -maximumFractionDigits - 1
for i in stride(from: 0, to: -maximumFractionDigits, by: -1) {
if s[s.index(s.endIndex, offsetBy: i - 1)] != "0" {
offset = i
break
}
}
return String(s[..<s.index(s.endIndex, offsetBy: offset)])
}
}
(fonctionne aussi avec extension Float
, mais pas avec le type uniquement macOS Float80
)
Utilisation: myNumericValue.string(maximumFractionDigits: 2)
ou myNumericValue.string()
Sortie pour maximumFractionDigits: 2
:
1.0 → "1"
0.12 → "0.12"
0.012 → "0.01"
0.0012 → "0"
0.00012 → "0"
Cela pourrait être utile aussi.
extension Float {
func cleanValue() -> String {
let intValue = Int(self)
if self == 0 {return "0"}
if self / Float (intValue) == 1 { return "\(intValue)" }
return "\(self)"
}
}
Usage:
let number:Float = 45.23230000
number.cleanValue()