This repository was archived by the owner on Jul 24, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathBigNumberFormatter.swift
More file actions
60 lines (48 loc) · 1.8 KB
/
BigNumberFormatter.swift
File metadata and controls
60 lines (48 loc) · 1.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//
// BigNumberFormatter.swift
// Telemetry Viewer
//
// Created by Daniel Jilg on 29.01.21.
//
import Foundation
class BigNumberFormatter {
static func roundedNeighbor(for numberString: String) -> Int? {
guard let number = Double(numberString) else { return nil }
let length = numberString.count
let divisor = (pow(10, length - 1) as NSDecimalNumber).doubleValue
let result = number / divisor
return Int(result.rounded() * divisor)
}
static func shortDisplay(for number: Double) -> String {
let numberFormatter = NumberFormatter()
numberFormatter.generatesDecimalNumbers = true
numberFormatter.maximumFractionDigits = 1
guard number >= 1000 else { return numberFormatter.string(from: NSNumber(value: number)) ?? "—" }
// Available Units
let units: [Double] = [
1000,
1_000_000,
1_000_000_000,
1_000_000_000_000
]
let unitPrefixes: [Double: String] = [
1000: "K",
1_000_000: "M",
1_000_000_000: "B",
1_000_000_000_000: "T"
]
// Find out the unit for the specified number
var unit: Double = 1
for currentUnit in units where number / currentUnit > 1 {
unit = currentUnit
}
// round to the nearest unit and add its prefix
let unitPrefix = unitPrefixes[unit] ?? ""
let roundedNumber = NSNumber(value: (number * 10 / unit).rounded() / 10)
return "\(numberFormatter.string(from: roundedNumber) ?? "")\(unitPrefix)"
}
static func shortDisplay(for numberString: String) -> String {
guard let number = Double(numberString) else { return numberString }
return shortDisplay(for: number)
}
}