Swift-小数が0に等しい場合、フロートから小数を削除するにはどうすればよいですか?


88

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

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

回答:


137

スウィフト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

スイフト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)
    }
}

私は前にこの行を追加しましたdistanceFloat = floor(distanceFloat * 10) / 10、そしてそれは完璧に機能しました、ありがとう:)
Kali Aney 2015

1
Doubleの場合、拡張子Double {var clean:String {return self%1 == 0?String(format: "%.0d"、self):String(self)}}
Abo3atef 2017年

3
フロートが3.01のようなものである場合、これは機能しません。
chengsam 2017年

負の数はどうですか?
Happiehappie

この123456738.0番号では機能しません。変換された番号は、123456736
AnirudhaMahale19年

116

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


2
完璧!これは上にある必要があります
GoodSp33d 2016

6
Swift 3の場合: let formatter = NumberFormatter() formatter.minimumFractionDigits = 0 formatter.maximumFractionDigits = 1 statLabel.text = formatter.string(from: value as NSNumber) ?? "n/a"
alexxjk 2017年

1
0.3000はどうですか、これを試してみます.3; 私はそのスタイルを設定しましたformatter.numberStyle = .decimal
stan liu 2018

@stanliuは正しいです.decimal。numberStyleを追加しないと、1未満の数値はゼロなしで表示されます。例:.5、.78など...今すぐ回答を編集しています。
HotFudgeSunday 2018

私はこれがそのような問題を解決するためのアップルの意図であると信じています。
DragonCherry

55

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ファイルのサンプルはこちらです。


1
しかし、3.230000-> 3.230000 ...「-> 3.23」はどうですか?
CHiP-love-NY 2016

1
@ CHiP-love-NY、私はあなたを取得できませんでした。
アショク2016年

1
彼はあなたの拡張機能が後続ゼロを削除しないと思っていると思いますが、削除します。String(3.230000)= "3.23"
jeffjv 2016年

34

迅速な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

あなたがieを置くときに動作しません。14.000005、14.0に変換
Vetuka 2017年

@ sc13ええと、それは奇妙です。14.00000005にプッシュすると、フロート自体が「cleanValue」なしで14を返します。これは、swiftがFloatを処理する方法と関係があると思います。そのバグを修正できるかどうかを確認します。
クリストファーラーセン

2
14.000005の正しい出力が得られるので、@ sc13コメントは廃止されているか正しくないようです。
・クール

10

文字列にフォーマットするには、このパターンに従ってください

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"

String(format:初期化子を使用すると、Swiftは次の数値に基づいて必要に応じて最後の桁を自動的に丸めます。


値が1.678の場合、これは機能しません
Saurav Nagpal

@SauravNagpalそれは動作します:)
Baig

9

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

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

使用例:

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

1
失敗し0.00000001ます。pubs.opengroup.org/onlinepubs/009695399/functions/printf.htmlの%gのドキュメントを参照してください: "使用されるスタイルは、変換された値によって異なります。スタイルe(またはE)は、そのような変換の結果の指数が使用される場合にのみ使用されます。以下より-4以上または精度に等しい。 "
・クール

完璧です。ありがとう
PhillipJacobs

7

Swift4ではこれを試してください。

    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)

値からゼロをトリミングしません1.1:出力はになります"1.10"
・クール

@Cœurpoint(。)の後に2つの値を表示するために使用されます。値を1つだけ表示する場合は、 "return self.truncatingRemainder(dividingBy:1)== 0?String(format:"%。0f "、self):String(format:"%。1f "、self)/を使用します。 / "
Jaydip 2018

私は知っています...私はあなたのコードが他のいくつかの回答の振る舞いとどのように異なるかを説明していました。
・クール

4

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

後続ゼロなしの最大小数桁でのフォーマット

このシナリオは、カスタム出力精度が必要な場合に適しています。このソリューションは、MirekEのNumberFormatter + NSNumberソリューションとほぼ同じくらい高速に見えますが、1つの利点は、ここで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」


4

Swift 5 for Doubleこれは、@ Frankieのfloatに対する回答と同じです。

var dec: Double = 1.0
dec.clean // 1

拡張用

extension Double {
    var clean: String {
       return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
    }

}

3

これが完全なコードです。

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. フロートの10進数をInt(number)。で削除します。
  2. ストリップされた数値をfloatに戻し、Float(Int(number))
  3. で10進数の値を取得します number - Float(Int(number))
  4. 10進数の値が空であることを確認します if number - Float(Int(number)) == 0

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


あなたの場合、doのString代わりに関数を返すようにしprintln(result)ますreturn result。これがお役に立てば幸いです。
ファイン男


2

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

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

-1

多分stringByReplacingOccurrencesOfStringあなたを助けることができます:)

let aFloat: Float = 1.000

let aString: String = String(format: "%.1f", aFloat) // "1.0"

let wantedString: String = aString.stringByReplacingOccurrencesOfString(".0", withString: "") // "1"

これは
1.05-

@Starceakerいいえ、最初に1.05実行String(format: "%.1f", aFloat)されます1.0、動作します。場合1.05に実行することString(format: "%.2f", aFloat)になり1.05、これを行う必要がありますよりstringByReplacingOccurrencesOfString(".00"...)
レオ

正解です。最後の行に焦点を合わせました。あなたはいくつかの解決策を提案したと思いましたが、実際にはあなたの回線は接続されています。私の悪い。
スターシーカー2016

それは何でもありません:)
レオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.