Visual_Novel_iOS/crush/Crush/Src/Models/Coin.swift

101 lines
2.8 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Coin.swift
// Crush
//
// Created by Leon on 2025/8/31.
//
import Foundation
///
struct Coin {
private(set) var cents: Int
init(cents: Int) {
self.cents = max(0, cents)
}
init(usd: CGFloat) {
cents = max(0, Int(round(usd * 100.0)))
}
init(input: String?) {
cents = Coin.parseInput(input)
}
var dollars: Decimal {
return Decimal(cents) / 100
}
/// 2
var formatted: String {
let decimal = dollars as NSDecimalNumber
let behavior = NSDecimalNumberHandler(
roundingMode: .down, //
scale: 2, // 2
raiseOnExactness: false,
raiseOnOverflow: false,
raiseOnUnderflow: false,
raiseOnDivideByZero: false
)
let truncated = decimal.rounding(accordingToBehavior: behavior)
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 2
formatter.usesGroupingSeparator = false
return formatter.string(from: truncated) ?? "0"
}
var thousandthsFormatted: String {
let decimal = dollars as NSDecimalNumber
let behavior = NSDecimalNumberHandler(
roundingMode: .down, //
scale: 2, // 2
raiseOnExactness: false,
raiseOnOverflow: false,
raiseOnUnderflow: false,
raiseOnDivideByZero: false
)
let truncated = decimal.rounding(accordingToBehavior: behavior)
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 2
formatter.usesGroupingSeparator = true //
return formatter.string(from: truncated) ?? "0"
}
private static func parseInput(_ text: String?) -> Int {
guard let text = text, !text.isEmpty else { return 0 }
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale(identifier: "en_US")
if let number = formatter.number(from: text) {
let decimal = Decimal(number.doubleValue)
return (decimal * 100 as NSDecimalNumber).intValue
}
return 0
}
/*
let m1 = Money(cents: 1234)
print(m1.formatted) // 12.34
let m2 = Money(cents: 1200)
print(m2.formatted) // 12
let m3 = Money(cents: 1250)
print(m3.formatted) // 12.5
let m4 = Money(cents: 10000)
print(m4.formatted) // 100
*/
}