2017-05-15 13 views
0

Swift에서 'number prettifier'를 쓰는 부동 소수점 정밀도 문제가 있습니다. > "5.0K" Swift 3 double rounding func

9999

- -> "9.9k"

50300 -> "50.3k"

5000

:

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

내 원하는 동작은 :이 코드가

99999 - 등> "99.9k"

...

,691,363 내가 가짜 정답 일부 문자열 조작을 할 수있어> "1000.0k"

thousands == 999.99900000000002로,하지만 -

999999 : 나는 999999에 전달하면210

그러나, 나는 얻을 나는 이것을 깔끔하게 구현하고 싶다. 어떤 제안?

감사합니다.

+0

- 당신은'ByteCountFormatter' 클래스에 관심이있을 수 있습니다. – rmaddy

+1

BTW -'99999'는'99.9k'가 아닙니다. 정말'100.0k'입니다. – rmaddy

+0

이 숫자는 바이트/kb/mb/gb 등의 측정 값이 아닙니다. –

답변

2

1로 최소 및 최대 소수 자리를 설정하는 수치 포매터를 사용하고 아래로 roundingMode가 설정할 수 있습니다 참고로

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

고맙습니다. - 이것은 훌륭합니다. 완전한 예를 제시 할 시간을 내 주셔서 감사합니다. –