web-dev-qa-db-ja.com

Swift-小数が0に等しい場合、浮動小数点から小数を削除する方法

小数点以下1桁で距離を表示していますが、0(例:1200.0Km)に等しい場合にこの小数点を削除したいのですが、どうすればそれを迅速に行うことができますか?この番号を次のように表示しています。

let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: "%.1f", distanceFloat) + "Km"
63
Kali Aney

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)
    }
}
84
Frankie

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

78
MirekE

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)

3.234

sampleValue = 3.0
print(sampleValue.cleanValue)

3

sampleValue = 3
print(sampleValue.cleanValue)

3


サンプルのPlaygroundファイルは ここ です。

53
Ashok

Swift 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
28

既に述べたように拡張機能を使用できますが、このソリューションは少し短くなります:

extension Float {
    var shortValue: String {
        return String(format: "%g", self)
    }
}

使用例:

var sample: Float = 3.234
print(sample.shortValue)
7
Niko

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)//
        }
    }

//使用方法-(。)ポイントの後に2文字以上を入力すると、最後の文字が自動的にトリミングされ、ポイントの後に2文字のみが表示されます。

let strValue = "32.12"
print(\(CGFloat(strValue).cleanValue)
6
Jaydip

文字列にフォーマットするには、このパターンに従います

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"
6
Baig

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"
4
vadian

ここに完全なコードがあります。

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) {
  1. Int(number)でフロートの10進数を取り除きます。
  2. Float(Int(number))で操作を行うために、剥ぎ取った数値を浮動小数点数に戻します。
  3. number - Float(Int(number))を使用して10進数値を取得します
  4. if number - Float(Int(number)) == 0で10進数値が空であることを確認します

ifおよびelseステートメント内の内容を説明する必要はありません。

3
Fine Man

末尾のゼロなしの最大小数桁での書式設定

このシナリオは、カスタム出力精度が必要な場合に適しています。この解決策は、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でも動作しますが、macOSのみのタイプFloat80では動作しません)

使用法:myNumericValue.string(maximumFractionDigits: 2)またはmyNumericValue.string()

maximumFractionDigits: 2の出力:

1.0→ "1"
0.12→ "0.12"
0.012→ "0.01"
0.0012→ "0"
0.00012→ "0"

3
Cœur

これも役立つかもしれません。

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()
2