Swift 2.0 Format 1000's into a friendly K's
extension Int { var roundedWithAbbreviations: String { let number = Double(self) let thousand = number / 1000 let million = number / 1000000 if million >= 1.0 { return "\(round(million*10)/10)M" } else if thousand >= 1.0 { return "\(round(thousand*10)/10)K" } else { return "\(self)" } }}print(11.roundedWithAbbreviations) // "11"print(11111.roundedWithAbbreviations) // "11.1K"print(11111111.roundedWithAbbreviations) // "11.1 M"
func formatPoints(num: Double) ->String{ let thousandNum = num/1000 let millionNum = num/1000000 if num >= 1000 && num < 1000000{ if(floor(thousandNum) == thousandNum){ return("\(Int(thousandNum))k") } return("\(thousandNum.roundToPlaces(1))k") } if num > 1000000{ if(floor(millionNum) == millionNum){ return("\(Int(thousandNum))k") } return ("\(millionNum.roundToPlaces(1))M") } else{ if(floor(num) == num){ return ("\(Int(num))") } return ("\(num)") }}extension Double { /// Rounds the double to decimal places value func roundToPlaces(places:Int) -> Double { let divisor = pow(10.0, Double(places)) return round(self * divisor) / divisor }}
The updated code should now not return a .0 if the number is whole. Should now output 1k instead of 1.0k for example. I just checked essentially if double and its floor were the same.
I found the double extension in this question:Rounding a double value to x number of decimal places in swift
The extension below does the following-
- Will display number 10456 as 10.5k and 10006 as 10k (will not show the
.0
decimals). - Will do the exact above for millions and format it i.e. 10.5M and 10M
Will format thousands upto 9999 in currency format i.e. with a comma like 9,999
extension Double { var kmFormatted: String { if self >= 10000, self <= 999999 { return String(format: "%.1fK", locale: Locale.current,self/1000).replacingOccurrences(of: ".0", with: "") } if self > 999999 { return String(format: "%.1fM", locale: Locale.current,self/1000000).replacingOccurrences(of: ".0", with: "") } return String(format: "%.0f", locale: Locale.current,self) }}
Usage:
let num: Double = 1000001.00 //this should be a Double since the extension is on Doublelet millionStr = num.kmFormattedprint(millionStr)
Prints 1M
And here it is in action-