Double+Extension.swift 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. //
  2. // Double+Extension.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/26.
  6. //
  7. import Foundation
  8. extension Double {
  9. var toDisplay: String {
  10. let formatter = NumberFormatter()
  11. formatter.maximumFractionDigits = 2
  12. return formatter.string(from: self as NSNumber) ?? "\(self)"
  13. }
  14. var currencyDisplay: String {
  15. let formatter = NumberFormatter()
  16. formatter.numberStyle = .decimal
  17. formatter.usesGroupingSeparator = false
  18. formatter.maximumFractionDigits = 2
  19. formatter.minimumFractionDigits = 0
  20. return formatter.string(from: self as NSNumber) ?? "\(self)"
  21. }
  22. var cashDisplay: String {
  23. let formatter = NumberFormatter()
  24. formatter.locale = Locale(identifier: "id_ID")
  25. formatter.numberStyle = .decimal
  26. formatter.usesGroupingSeparator = true
  27. formatter.maximumFractionDigits = 2
  28. formatter.minimumFractionDigits = 0
  29. return formatter.string(from: self as NSNumber) ?? "\(self)"
  30. }
  31. var durationDisplay: String {
  32. "\(toDuration)“"
  33. }
  34. var toDuration: Int {
  35. Int(rounded())
  36. }
  37. var timeCountDisplay: String {
  38. toDuration.timeCountDisplay
  39. }
  40. func formattedAsShortNumber(fractionDigits: Int = 1) -> String {
  41. let absNum = abs(self)
  42. // 定义量级:(基数, 单位),按中文/英文区分
  43. let units: [(Double, String)] = [
  44. (1e12, "T"), // 万亿
  45. (1e9, "B"), // 十亿
  46. (1e6, "M"), // 百万
  47. (1e3, "K") // 千
  48. ]
  49. // 遍历量级,找到匹配的单位
  50. for (threshold, unit) in units {
  51. if absNum >= threshold {
  52. let formattedNum = self / threshold
  53. // 格式化小数,去掉无意义的尾缀(如 5.0 → 5)
  54. let formatter = NumberFormatter()
  55. formatter.maximumFractionDigits = fractionDigits
  56. formatter.minimumFractionDigits = formattedNum.truncatingRemainder(dividingBy: 1) == 0 ? 0 : fractionDigits
  57. guard let str = formatter.string(from: NSNumber(value: formattedNum)) else {
  58. return "\(Int(formattedNum))\(unit)"
  59. }
  60. return "\(str)\(unit)"
  61. }
  62. }
  63. // 小于1000,直接显示原数字(无单位)
  64. let formatter = NumberFormatter()
  65. formatter.maximumFractionDigits = fractionDigits
  66. formatter.minimumFractionDigits = 0
  67. return formatter.string(from: NSNumber(value: self)) ?? "\(Int(self))"
  68. }
  69. }