commit a747968ddc6e027e62fd869019d3fe3a9bb70e73
parent 459811ce8e5e04a39ca9ca0acc8c0bed39bbf613
Author: Marc Stibane <marc@taler.net>
Date: Thu, 31 Aug 2023 21:11:44 +0200
ScopedCurrencyInfo, SuperScriptDigit
Diffstat:
2 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/TalerWallet1/Model/Model+Exchange.swift b/TalerWallet1/Model/Model+Exchange.swift
@@ -78,12 +78,6 @@ fileprivate struct AddExchange: WalletBackendFormattedRequest {
}
/// A request to get info about a currency
-struct ScopedCurrencyInfo: Decodable {
- var decimalSeparator: String
- var numFractionalDigits: Int // 0 Yen, 2 €,$, 3 arabic
- var numTinyDigits: Int // SuperScriptDigits
- var isCurrencyNameLeading: Bool
-}
fileprivate struct GetScopedCurrencyInfo: WalletBackendFormattedRequest {
typealias Response = ScopedCurrencyInfo
diff --git a/taler-swift/Sources/taler-swift/Amount.swift b/taler-swift/Sources/taler-swift/Amount.swift
@@ -4,6 +4,22 @@
*/
import Foundation
+public func SuperScriptDigit(_ number: UInt32) -> String {
+ switch number {
+ case 0: return String("\u{2070}")
+ case 1: return String("\u{00B9}")
+ case 2: return String("\u{00B2}")
+ case 3: return String("\u{00B3}")
+ case 4: return String("\u{2074}")
+ case 5: return String("\u{2075}")
+ case 6: return String("\u{2076}")
+ case 7: return String("\u{2077}")
+ case 8: return String("\u{2078}")
+ case 9: return String("\u{2079}")
+ default: return ""
+ }
+}
+
/// Errors for `Amount`.
enum AmountError: Error {
/// The string cannot be parsed to create an `Amount`.
@@ -22,6 +38,13 @@ enum AmountError: Error {
case divideByZero
}
+public struct ScopedCurrencyInfo: Codable {
+ var decimalSeparator: String
+ var numFractionalDigits: Int // 0 Yen, 2 €,$, 3 arabic
+ var numTinyDigits: Int // SuperScriptDigits
+ var isCurrencyNameLeading: Bool
+}
+
/// A value of some currency.
public class Amount: Codable, Hashable, CustomStringConvertible {
/// Format that a currency must match.
@@ -45,6 +68,9 @@ public class Amount: Codable, Hashable, CustomStringConvertible {
/// The fractional value of the amount (number to the right of the decimal point).
var fraction: UInt32
+ /// Additional info for formatting currency strings
+ var currencyInfo: ScopedCurrencyInfo?
+
public func hash(into hasher: inout Hasher) {
hasher.combine(currency)
if let normalized = try? normalizedCopy() {
@@ -69,6 +95,10 @@ public class Amount: Codable, Hashable, CustomStringConvertible {
/// The string representation of the value, formatted as "`integer`.`fraction`".
public var valueStr: String {
+ var decimalSeparator = "."
+ if let currencyInfo {
+ decimalSeparator = currencyInfo.decimalSeparator
+ }
if fraction == 0 {
return "\(integer)"
} else {
@@ -78,7 +108,7 @@ public class Amount: Codable, Hashable, CustomStringConvertible {
fracStr += "\(frac / (Amount.fractionalBase / 10))"
frac = (frac * 10) % Amount.fractionalBase
}
- return "\(integer).\(fracStr)"
+ return "\(integer)\(decimalSeparator)\(fracStr)"
}
}