diff --git a/BDKSwiftExampleWallet/Extensions/Int+Extensions.swift b/BDKSwiftExampleWallet/Extensions/Int+Extensions.swift index 1802ca84..4350049f 100644 --- a/BDKSwiftExampleWallet/Extensions/Int+Extensions.swift +++ b/BDKSwiftExampleWallet/Extensions/Int+Extensions.swift @@ -34,6 +34,16 @@ extension UInt64 { } extension UInt64 { + private var numberFormatter: NumberFormatter { + let numberFormatter = NumberFormatter() + numberFormatter.numberStyle = .decimal + numberFormatter.usesGroupingSeparator = true + numberFormatter.groupingSeparator = "," + numberFormatter.generatesDecimalNumbers = false + + return numberFormatter + } + func formattedSatoshis() -> String { if self == 0 { return "0.00 000 000" @@ -58,6 +68,17 @@ extension UInt64 { return formattedBalance } } + + func formattedBip177() -> String { + if self != .zero && self >= 1_000_000 && self % 1_000_000 == .zero { + return "\(self / 1_000_000)M" + + } else if self != .zero && self % 1_000 == 0 { + return "\(self / 1_000)K" + } + + return numberFormatter.string(from: NSNumber(value: self)) ?? "0" + } } extension Int { diff --git a/BDKSwiftExampleWallet/Model/BalanceDisplayFormat.swift b/BDKSwiftExampleWallet/Model/BalanceDisplayFormat.swift index 6f93373d..24eef3fb 100644 --- a/BDKSwiftExampleWallet/Model/BalanceDisplayFormat.swift +++ b/BDKSwiftExampleWallet/Model/BalanceDisplayFormat.swift @@ -13,11 +13,12 @@ enum BalanceDisplayFormat: String, CaseIterable, Codable { case sats = "sats" case bip21q = "bip21q" case fiat = "usd" + case bip177 = "bip177" var displayText: String { switch self { case .sats, .bitcoinSats: return "sats" - case .bitcoin: return "" + case .bitcoin, .bip177: return "" case .bip21q: return "₿" case .fiat: return "USD" } diff --git a/BDKSwiftExampleWallet/View/Home/BalanceView.swift b/BDKSwiftExampleWallet/View/Home/BalanceView.swift index 6b154b7b..31374e65 100644 --- a/BDKSwiftExampleWallet/View/Home/BalanceView.swift +++ b/BDKSwiftExampleWallet/View/Home/BalanceView.swift @@ -48,6 +48,8 @@ struct BalanceView: View { return balance.formatted(.number) case .fiat: return satsPrice.formatted(.number.precision(.fractionLength(2))) + case .bip177: + return balance.formattedBip177() } } diff --git a/BDKSwiftExampleWalletTests/Extensions/BDKSwiftExampleWalletInt+Extensions.swift b/BDKSwiftExampleWalletTests/Extensions/BDKSwiftExampleWalletInt+Extensions.swift index 4b6ce499..06497472 100644 --- a/BDKSwiftExampleWalletTests/Extensions/BDKSwiftExampleWalletInt+Extensions.swift +++ b/BDKSwiftExampleWalletTests/Extensions/BDKSwiftExampleWalletInt+Extensions.swift @@ -31,4 +31,38 @@ final class BDKSwiftExampleWalletInt_Extensions: XCTestCase { XCTAssertEqual(tenBTC, "10.00 000 001") } + func testBip177() { + let oneHundred = UInt64(100).formattedBip177() + XCTAssertEqual(oneHundred, "100") + + let oneThousand = UInt64(1000).formattedBip177() + XCTAssertEqual(oneThousand, "1K") + + let oneThousandOne = UInt64(1001).formattedBip177() + XCTAssertEqual(oneThousandOne, "1,001") + + let tenThousand = UInt64(10000).formattedBip177() + XCTAssertEqual(tenThousand, "10K") + + let tenThousandOne = UInt64(10001).formattedBip177() + XCTAssertEqual(tenThousandOne, "10,001") + + let oneHundredThousand = UInt64(100000).formattedBip177() + XCTAssertEqual(oneHundredThousand, "100K") + + let oneHundredThousandOne = UInt64(100001).formattedBip177() + XCTAssertEqual(oneHundredThousandOne, "100,001") + + let oneMillion = UInt64(1000000).formattedBip177() + XCTAssertEqual(oneMillion, "1M") + + let oneMillionOne = UInt64(1000001).formattedBip177() + XCTAssertEqual(oneMillionOne, "1,000,001") + + let treeMillions = UInt64(325_000_000).formattedBip177() + XCTAssertEqual(treeMillions, "325M") + + let treeMillionsOne = UInt64(325_000_001).formattedBip177() + XCTAssertEqual(treeMillionsOne, "325,000,001") + } }