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

101 lines
2.8 KiB
Swift
Raw Normal View History

2025-10-09 10:29:35 +00:00
//
// 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
*/
}