2017-05-15 4 views
0

私はSwiftに 'number prettifier'を書く浮動小数点精度の問題があります。私はこのコードを持っている:Swift 3 double rounding func

func prettifyNumber(number:Int) -> String { 
    let thousands = Double(number)/1000.0; 
    var prettyNumber = String(format: "%.1fk", thousands) 
    return prettyNumber 
} 

は私の希望の動作は以下のとおりです。

5000 - > "50.3k" - > "5.0k"

9999 - > "9.9k"

99999 - > "99.9k"

等...

私は999999に渡す場合210

はしかし、私が取得:

999999からthousands == 999.99900000000002

と> "1000.0k"

私は偽物に正しい答えをいくつかの文字列操作を行うことができます知っているが、私はこれをきちんと実装したいと思います。助言がありますか?

多くの感謝!

+0

- あなたは 'ByteCountFormatter'クラスに興味があるかもしれません。 – rmaddy

+1

BTW - '99999'は' 99.9k'ではありません。それは本当に '100.0k'です。 – rmaddy

+0

これらの数値は、バイト/ kb/mb/gbなどの尺度ではありません。 –

答えて

2

あなたは1に最小値と最大小数の桁数を設定する数値フォーマッタを使用してまでroundingModeを設定することができます。FYI

extension Formatter { 
    static let kNumber: NumberFormatter = { 
     let formatter = NumberFormatter() 
     formatter.numberStyle = .decimal 
     formatter.maximumFractionDigits = 1 
     formatter.minimumFractionDigits = 1 
     formatter.roundingMode = .down 
     return formatter 
    }() 
} 

extension Int { 
    var kFormatted: String { 
     return (Formatter.kNumber.string(for: Double(self).divided(by: 1000)) ?? "") + "k" 
    } 
} 

5000.kFormatted  // "5.0k" 
9999.kFormatted // "9.9k" 
50300.kFormatted // "50.3k" 
99999.kFormatted // "99.9k" 
+1

ありがとう - これは素晴らしいです。完全な例を描く時間を割いていただき、本当にありがとうございます。 –