Какая функция удаляет конечные нули из двойных чисел?
var double = 3.0
var double2 = 3.10
println(func(double)) // 3
println(func(double2)) // 3.1
Какая функция удаляет конечные нули из двойных чисел?
var double = 3.0
var double2 = 3.10
println(func(double)) // 3
println(func(double2)) // 3.1
В Swift 4 вы можете сделать это так:
extension Double {
func removeZerosFromEnd() -> String {
let formatter = NumberFormatter()
let number = NSNumber(value: self)
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 16 //maximum digits in Double after dot (maximum precision)
return String(formatter.string(from: number) ?? "")
}
}
пример использования: print (Double("128834.567891000").removeZerosFromEnd())
результат: 128834.567891
Вы также можете подсчитать, сколько десятичных цифр содержит ваша строка:
import Foundation
extension Double {
func removeZerosFromEnd() -> String {
let formatter = NumberFormatter()
let number = NSNumber(value: self)
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = (self.components(separatedBy: ".").last)!.count
return String(formatter.string(from: number) ?? "")
}
}
Вы можете сделать это так, но он вернет строку:
var double = 3.0
var double2 = 3.10
func forTrailingZero(temp: Double) -> String {
var tempVar = String(format: "%g", temp)
return tempVar
}
forTrailingZero(double) //3
forTrailingZero(double2) //3.1
forTailingZero(123456789) == 1.23457e+08
:)
- person Martin R; 10.04.2015
Этот сценарий хорош, когда требуется точность вывода по умолчанию. Мы проверяем значение на возможные нули в конце и используем другой формат вывода в зависимости от этого.
extension Double {
var stringWithoutZeroFraction: String {
return truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
}
}
(работает также с extension Float
, но не с Float80
)
Выход:
1,0 → 1
0,1 → 0,1
0,01 → 0,01
0,001 → 0,001
0,0001 → 0,0001
Этот сценарий хорош, когда требуется пользовательская точность вывода. Это решение кажется примерно таким же быстрым, как NumberFormatter + NSNumber решение от MirekE, но одним из преимуществ может быть то, что мы избегаем NSObject здесь .
extension Double {
func string(maximumFractionDigits: Int = 2) -> String {
let s = String(format: "%.\(maximumFractionDigits)f", self)
for i in stride(from: 0, to: -maximumFractionDigits, by: -1) {
if s[s.index(s.endIndex, offsetBy: i - 1)] != "0" {
return String(s[..<s.index(s.endIndex, offsetBy: i)])
}
}
return String(s[..<s.index(s.endIndex, offsetBy: -maximumFractionDigits - 1)])
}
}
(работает также с extension Float
, но не с Float80
)
Вывод для maximumFractionDigits: 2
:
1,0 → 1
0,12 → 0,12
0,012 → 0,01
0,0012 → 0
0,00012 → 0
Обратите внимание, что он выполняет округление (так же, как решение MirekE):
0,9950000 → 0,99
0,9950001 → 1
maximumFractionDigits
= 0, 254,99998480081558 ==> 25
- person hstdt; 21.07.2020
Если вы ищете, как удалить конечные нули из строки:
string.replacingOccurrences(of: "^([\d,]+)$|^([\d,]+)\.0*$|^([\d,]+\.[0-9]*?)0*$", with: "$1$2$3", options: .regularExpression)
Это преобразует такие строки, как 0,123000000, в 0,123.
Все ответы, которые я нашел, были хорошими, но все они имели некоторые проблемы, такие как создание десятичных чисел без 0
в начале (например, .123
вместо 0.123
). но эти два сделают работу без проблем:
extension Double {
func formatNumberWithFixedFraction(maximumFraction: Int = 8) -> String {
let stringFloatNumber = String(format: "%.\(maximumFraction)f", self)
return stringFloatNumber
}
func formatNumber(maximumFraction: Int = 8) -> String {
let formatter = NumberFormatter()
let number = NSNumber(value: self)
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = maximumFraction
formatter.numberStyle = .decimal
formatter.allowsFloats = true
let formattedNumber = formatter.string(from: number).unwrap
return formattedNumber
}
}
Первый преобразует 71238.12
с maxFraction 8 в: 71238.12000000
, а второй с maxFraction 8 преобразует его в: 71238.12
NSNumberFormatter
илиString(format: ...)
. Здесь, на SO, уже должно быть несколько примеров для обоих. - person Martin R   schedule 10.04.2015