什么是从double中删除尾随零的函数?
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
func forTrailingZero(_ temp: Double) -> String {
var tempVar = String(format: "%g", temp)
return tempVar
}
forTrailingZero(double) //3
forTrailingZero(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) ?? "")
}
}
当需要使用默认输出精度时,这种场景非常适用。我们测试该值是否存在潜在的末尾零,并根据不同情况使用不同的输出格式。
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”
当需要自定义输出精度时,此场景非常好。这种解决方案似乎与MirekE的NumberFormatter + NSNumber 解决方案速度相近,但一个好处是我们避免了在这里使用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" - hstdt如果你正在寻找如何从字符串中删除末尾的零:
string.replacingOccurrences(of: "^([\d,]+)$|^([\d,]+)\.0*$|^([\d,]+\.[0-9]*?)0*$", with: "$1$2$3", options: .regularExpression)
我找到的所有答案都不错,但是它们中的一些都存在问题,例如生成没有以 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
转换为: 71238.12000000
,而第二个也是将 同样小数点后最多保留8位 的71238.12
进行转换,结果为:71238.12
。这个对我有用,将其作为String
返回给文本标签
func ridZero(result: Double) -> String {
let value = String(format: "%g", result)
return value
}
以下是结果
ridZero(result: 3.0) // "3"
ridZero(result: 3.5) // "3.5"
NSNumberFormatter
或者String(format:...)
。这两种方法在这里的SO上应该已经有一些示例了。 - Martin R