Swift - 从Double中删除尾随零

Bog*_*nov 17 double trailing ios swift

从双打中删除尾随零的函数是什么?

var double = 3.0
var double2 = 3.10

println(func(double)) // 3
println(func(double2)) // 3.1
Run Code Online (Sandbox Code Playgroud)

Dha*_*esh 47

你可以这样做但它会返回一个字符串:

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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果数字变得太大,"%g"格式会切换到科学记数法:`forTailingZero(123456789)== 1.23457e + 08` :) (10认同)
  • 我认为在这个答案中描述了更优化的解决方案:http://stackoverflow.com/a/30664610/2859764 (8认同)

Grz*_*sza 12

在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) ?? "")
    }
}
Run Code Online (Sandbox Code Playgroud)

使用示例: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) ?? "")
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它将 "0.517" 转换为 ".517" 。这不可能是少数人的要求 (2认同)
  • 我认为在这种情况下你可以使用“formatter.minimumIntegerDigits = 1”。 (2认同)

Cœu*_*œur 5

消除输出中的尾随零

当需要默认输出精度时,这种情况很好。我们测试可能的尾随零值,并根据其使用不同的输出格式。

extension Double {
    var stringWithoutZeroFraction: String {
        return truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

(也适用于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)])
    }
}
Run Code Online (Sandbox Code Playgroud)

(也适用于extension Float,但不适用Float80

输出为maximumFractionDigits: 2

1.0?“ 1”
0.12吗?“ 0.12”
0.012吗?“ 0.01”
0.0012吗?“ 0”
0.00012?“ 0”