Swift - Как удалить десятичное число из float, если десятичное число равно 0?
Я показываю расстояние с одним десятичным знаком, и я хотел бы удалить это десятичное число, если оно равно 0 (например: 1200.0Km), как я могу сделать это в swift?
Я показываю этот номер следующим образом:
let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: "%.1f", distanceFloat) + "Km"
Ответы
Ответ 1
Свифт 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 (Оригинальный ответ)
let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: distanceFloat == floor(distanceFloat) ? "%.0f" : "%.1f", distanceFloat) + "Km"
Или как расширение:
extension Float {
var clean: String {
return self % 1 == 0 ? String(format: "%.0f", self) : String(self)
}
}
Ответ 2
Используйте 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")
}
Возвращает:
3
5,1
7,21
9,31
600
0,57
0.7
Ответ 3
extension
является мощным способом сделать это.
Расширение:
Код для Swift 2 (не Swift 3 или новее):
extension Float {
var cleanValue: String {
return self % 1 == 0 ? String(format: "%.0f", self) : String(self)
}
}
Использование:
var sampleValue: Float = 3.234
print(sampleValue.cleanValue)
3,234
sampleValue = 3.0
print(sampleValue.cleanValue)
3
sampleValue = 3
print(sampleValue.cleanValue)
3
Пример файла Playground находится здесь.
Ответ 4
Обновление принятого ответа для быстрого 3:
extension Float
{
var cleanValue: String
{
return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
}
}
будет просто:
let someValue: Float = 3.0
print(someValue.cleanValue) //prints 3
Ответ 5
Вы можете использовать расширение, как уже упоминалось, хотя это решение немного короче:
extension Float {
var shortValue: String {
return String(format: "%g", self)
}
}
Пример использования:
var sample: Float = 3.234
print(sample.shortValue)
Ответ 6
Чтобы отформатировать его в String, следуйте этому шаблону
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"
Чтобы отформатировать его в Int, следуйте этому шаблону
let aInt: Int = Int(aFloat) // "1"
Ответ 7
В Swift 4 попробуйте это.
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)//
}
}
//Как использовать - если вы вводите более двух символов после (.), Это автоматически обрезает последний символ и отображает только два символа после точки.
let strValue = "32.12"
print(\(CGFloat(strValue).cleanValue)
Ответ 8
NSNumberFormatter - ваш друг
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"
Ответ 9
Здесь полный код.
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
Здесь самая важная строка в глубину.
func displayNumber(number: Float) {
- Сбрасывает десятичные числа с плавающей запятой
Int(number)
.
- Возвращает оставшееся число обратно к float для выполнения операции с
Float(Int(number))
.
- Возвращает десятичное число с
number - Float(Int(number))
- Проверяет, что значение десятичной цифры пустое с помощью
if number - Float(Int(number)) == 0
Содержимое внутри операторов if и else не нуждается в пояснении.
Ответ 10
Форматирование с максимальными дробными цифрами, без конечных нулей
Этот сценарий хорош, когда желательна настраиваемая точность вывода. Это решение кажется примерно таким же быстрым, как решение NumberFormatter + NSNumber от MirekE, но одним из преимуществ может быть то, что мы избегаем здесь NSObject.
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)])
}
}
(работает также с extension Float
, но не с типом Float80
только для Float80
)
Использование: myNumericValue.string(maximumFractionDigits: 2)
или myNumericValue.string()
Выходные данные для maximumFractionDigits: 2
:
1.0 → "1"
0,12 → "0,12"
0,012 → "0,01"
0,0012 → "0"
0,00012 → "0"
Ответ 11
Это также может быть полезно.
extension Float {
func cleanValue() -> String {
let intValue = Int(self)
if self == 0 {return "0"}
if self / Float (intValue) == 1 { return "\(intValue)" }
return "\(self)"
}
}
Использование:
let number:Float = 45.23230000
number.cleanValue()
Ответ 12
Здесь расширение, которое должно выполнить трюк:
extension String {
var clean: String
{
var stringCharacters = Array(self.characters)
var isDoubleDot = false
for character in stringCharacters {
if character == "." {
isDoubleDot = true
break
} else {
isDoubleDot = false
}
}
if isDoubleDot == true {
while 1 == 1 {
if stringCharacters[stringCharacters.count-1] == "0" || stringCharacters[stringCharacters.count-1] == "." {
stringCharacters.remove(at: stringCharacters.count-1)
} else {
break
}
}
return String(stringCharacters)
} else {
return self
}
}
}
Использование:
let number1 = "54.530000"
let number2 = "65.0"
let number3 = "21.243"
print(number1.clean) //54.53
print(number2.clean) //65
print(number3.clean) //21.243
Ответ 13
Просто:
Int(floor(myFloatValue))
Ответ 14
Может быть, stringByReplacingOccurrencesOfString
может вам помочь:)
let aFloat: Float = 1.000
let aString: String = String(format: "%.1f", aFloat) // "1.0"
let wantedString: String = aString.stringByReplacingOccurrencesOfString(".0", withString: "") // "1"