web-dev-qa-db-ja.com

Swift-ダブルから末尾のゼロを削除

Doubleから後続のゼロを削除する関数は何ですか?

var double = 3.0
var double2 = 3.10

println(func(double)) // 3
println(func(double2)) // 3.1
20
Bogdan Bogdanov

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) ?? "")
    }
}
_
12

この方法で行うことができますが、文字列を返します。

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
47
Dharmesh

出力の末尾のゼロを削除する

このシナリオは、デフォルトの出力精度が必要な場合に適しています。後続のゼロの可能性について値をテストし、それに応じて異なる出力形式を使用します。

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からのソリューション とほぼ同じくらい高速に見えますが、1つの利点は、ここで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"

5
Cœur