SwiftCryptoTokenFormatter
Formatter for crypto token amounts.
Rules
- Cut off after the 5th decimal, no matter how many decimals there are: 0.12345
 - Remove trailing zeroes, i.e. display 0.10000 as 0.1
 - Use the 5 decimals up until 999.99999
 - Display '< 0.00001' for values less than 0.00001
 - Use 1 decimal less from 1,000.0001 until 9,999.9999
 - Use 1 decimal less from 10,000.001 until 99,999.999
 - Use 1 decimal less from 100,000.01 until 999,999.99
 - Use 1 decimal less from 1,000,000.1 until 9,999,999.9
 - From 10,000,000 No Decimals until 99,999,999
 - Then Use 10.001M until 999.999M
 - Then 1.001B until 999.999B
 - Then 1.001T until 999.999T
 - Then just > 999T
 - Thousands and decimal separators are used according to user's locale.
 - M, B, T is localized
 
import SwiftCryptoTokenFormatter
import BigInt
let f = TokenFormatter()
f.string(from: BigDecimal(100_000_000_000000000, 9)) // 100M
f.string(from: BigDecimal(BigInt("999999999000000000000"), 9)) // 999.999BFeatures
Custom rounding behaviour
f.roundingBehavior = .cutoff
f.string(from: BigDecimal(0_0000101, 7)) // 0.00001
f.roundingBehavior = .roundUp
f.string(from: BigDecimal(0_0000101, 7)) // 0.00002Support of negative numbers
f.string(from: BigDecimal(-10_000_001000000, 9) // -10,000.001Number from string
f.number(from: "0,001", precision: 3) == BigDecimal(1, 3)Localizatoin
string(from:) allows to override default decimalSeparator, thousandSeparator and literals.
localizedString(from:) uses:
Locale.autoupdatingCurrentfordecimalSeparatorandthousandSeparator"amount_millions","amount_billions"and"amount_trillions"localized strings from literals. You need to provide localizable strings for different locales.
// Assuming russian locale and "amount_billions" = "Б"
formatter.localizedString(from: BigDecimal(BigInt("999999999000000000000"), 9)) // 999,999БInstallation
Prerequisites
- iOS 11.0 or macOS 10.14
 - Xcode 10.3
 - Swift 5
 
Manual
Add this repository as a submodule:
git submodule add https://github.com/gnosis/SwiftCryptoTokenFormatter.git
Fetch the dependencies
cd SwiftCryptoTokenFormatter
git submodule update --init
Dependencies of the SwiftCryptoTokenFormatter library:
- BigInt
 
Drag and drop the SwiftCryptoTokenFormatter.xcodeproj into your project and link the SwiftCryptoTokenFormatter static library.
CocoaPods
pod 'SwiftCryptoTokenFormatter'
Carthage
In your Cartfile:
github "gnosis/SwiftCryptoTokenFormatter"
Run carthage update to build the framework and drag the SwiftCryptoTokenFormatter.framework into your Xcode project.
Swift Package Manager
You can use Swift Package Manager and add dependency in your Package.swift:
    dependencies: [
        .package(url: "https://github.com/gnosis/SwiftCryptoTokenFormatter.git", .upToNextMinor(from: "1.0.0"))
    ]
Contributors
- Dmitry Bespalov (DmitryBespalov)
 - Andrey Scherbovich (sche)
 
License
MIT License (see the LICENSE file).