J'affiche une distance avec une décimale, et je voudrais supprimer cette décimale au cas où elle serait égale à 0 (ex: 1200.0Km), comment pourrais-je faire cela en Swift? J'affiche ce numéro comme ceci:
let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: "%.1f", distanceFloat) + "Km"
ios
swift
floating-point
Kali Aney
la source
la source
Réponses:
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 en extension:
extension Float { var clean: String { return self % 1 == 0 ? String(format: "%.0f", self) : String(self) } }
la source
distanceFloat = floor(distanceFloat * 10) / 10
et cela a fonctionné parfaitement, merci :)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") }
Retour:
3
5.1
7,21
9,31
600
0,57
0,7
la source
let formatter = NumberFormatter() formatter.minimumFractionDigits = 0 formatter.maximumFractionDigits = 1 statLabel.text = formatter.string(from: value as NSNumber) ?? "n/a"
formatter.numberStyle = .decimal
.decimal
nombres numberStyle inférieurs à 1 s'afficheront sans zéro. Ex: .5, .78, etc ... Modification de la réponse maintenant.extension
est le moyen puissant de 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)
sampleValue = 3.0 print(sampleValue.cleanValue)
sampleValue = 3 print(sampleValue.cleanValue)
Un exemple de fichier Playground est ici .
la source
Mise à jour de la réponse acceptée pour swift 3 :
extension Float { var cleanValue: String { return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self) } }
l'utilisation serait juste:
let someValue: Float = 3.0 print(someValue.cleanValue) //prints 3
la source
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 convertir en Int, suivez ce modèle
let aInt: Int = Int(aFloat) // "1"
Lorsque vous utilisez l'
String(format:
initialiseur, Swift arrondira automatiquement le dernier chiffre selon les besoins en fonction du nombre suivant.la source
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)
la source
0.00000001
. Voir la documentation de% g sur pubs.opengroup.org/onlinepubs/009695399/functions/printf.html : " Le style utilisé dépend de la valeur convertie; le style e (ou E) ne sera utilisé que si l'exposant résultant d'une telle conversion est inférieur à -4 ou supérieur ou égal à la précision. "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 (.), Il recadre automatiquement le dernier caractère et n'affiche que deux caractères après le point.
let strValue = "32.12" print(\(CGFloat(strValue).cleanValue)
la source
1.1
: la sortie sera"1.10"
.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"
la source
Formatage avec des chiffres de fraction maximum, sans zéros de fin
Ce scénario est bon lorsqu'une précision de sortie personnalisée est souhaitée. Cette solution semble à peu près aussi rapide que la solution NumberFormatter + NSNumber de MirekE , mais un avantage 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 également avec
extension Float
, mais pas uniquement avec le type macOSFloat80
)Utilisation:
myNumericValue.string(maximumFractionDigits: 2)
oumyNumericValue.string()
Sortie pour
maximumFractionDigits: 2
:la source
Swift 5 pour Double c'est la même chose que la réponse de @ Frankie pour float
var dec: Double = 1.0 dec.clean // 1
pour l'extension
extension Double { var clean: String { return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self) } }
la source
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
Le contenu des instructions if et else n'a pas besoin d'être expliqué.
la source
String
et au lieu deprintln(result)
fairereturn result
. J'espère que ça aide!Facile :
Int(floor(myFloatValue))
la source
Cela pourrait aussi être utile.
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()
la source
Peut
stringByReplacingOccurrencesOfString
- être pourrait vous aider :)let aFloat: Float = 1.000 let aString: String = String(format: "%.1f", aFloat) // "1.0" let wantedString: String = aString.stringByReplacingOccurrencesOfString(".0", withString: "") // "1"
la source
1.05
exécutez enString(format: "%.1f", aFloat)
premier sera1.0
, fonctionne. si1.05
exécuterString(format: "%.2f", aFloat)
sera1.05
, et que devrait le fairestringByReplacingOccurrencesOfString(".00"...)