Я показываю расстояние с одним десятичным знаком, и я хотел бы удалить это десятичное число, если оно равно 0 (например, 1200,0 км), как я могу сделать это быстро? Я показываю это число так:
let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: "%.1f", distanceFloat) + "Km"
ios
swift
floating-point
Кали Эней
источник
источник
Ответы:
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 (оригинальный ответ)
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) } }
источник
distanceFloat = floor(distanceFloat * 10) / 10
и она отлично сработала, спасибо :)Используйте 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
источник
let formatter = NumberFormatter() formatter.minimumFractionDigits = 0 formatter.maximumFractionDigits = 1 statLabel.text = formatter.string(from: value as NSNumber) ?? "n/a"
formatter.numberStyle = .decimal
.decimal
numberStyle, номера ниже 1 будут отображаться без нуля. Например: 0,5, 0,78 и т. Д. Сейчас редактируем ответ.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)
sampleValue = 3.0 print(sampleValue.cleanValue)
sampleValue = 3 print(sampleValue.cleanValue)
Образец файла Playground находится здесь .
источник
Обновление принятого ответа для быстрого 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
источник
Чтобы отформатировать его в 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"
Когда вы используете
String(format:
инициализатор, Swift автоматически округляет последнюю цифру по мере необходимости на основе следующего числа.источник
Вы можете использовать расширение, как уже упоминалось, но это решение немного короче:
extension Float { var shortValue: String { return String(format: "%g", self) } }
Пример использования:
var sample: Float = 3.234 print(sample.shortValue)
источник
0.00000001
. См. Документацию% g по адресу pubs.opengroup.org/onlinepubs/009695399/functions/printf.html : « Используемый стиль зависит от преобразованного значения; стиль e (или E) должен использоваться только в том случае, если показатель степени, полученный в результате такого преобразования меньше -4 или больше или равно точности »В 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)
источник
1.1
: вывод будет"1.10"
.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"
источник
Форматирование с максимальным количеством цифр дробной части, без конечных нулей
Этот сценарий хорош, когда требуется настраиваемая точность вывода. Это решение кажется примерно таким же быстрым, как решение 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
, но не только с macOSFloat80
)Использование:
myNumericValue.string(maximumFractionDigits: 2)
илиmyNumericValue.string()
Вывод для
maximumFractionDigits: 2
:источник
Swift 5 для Double, это то же самое, что и ответ @Frankie для float
var dec: Double = 1.0 dec.clean // 1
для расширения
extension Double { var clean: String { return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self) } }
источник
Вот полный код.
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(Int(number))
.number - Float(Int(number))
if number - Float(Int(number)) == 0
Содержимое операторов if и else не требует объяснения.
источник
String
и вместоprintln(result)
doreturn result
. Надеюсь, это поможет!Просто :
Int(floor(myFloatValue))
источник
Это тоже может быть полезно.
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()
источник
Может быть,
stringByReplacingOccurrencesOfString
мог бы вам помочь :)let aFloat: Float = 1.000 let aString: String = String(format: "%.1f", aFloat) // "1.0" let wantedString: String = aString.stringByReplacingOccurrencesOfString(".0", withString: "") // "1"
источник
1.05
выполнитьString(format: "%.1f", aFloat)
будет1.0
, работает. если1.05
выполнитьString(format: "%.2f", aFloat)
будет1.05
, и чем следует это сделатьstringByReplacingOccurrencesOfString(".00"...)