Localizer.swift 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // LoopFollow
  2. // Localizer.swift
  3. import Foundation
  4. import HealthKit
  5. class Localizer {
  6. static func getPreferredUnit() -> HKUnit {
  7. let unitString = Storage.shared.units.value
  8. switch unitString {
  9. case "mmol/L":
  10. return .millimolesPerLiter
  11. default:
  12. return .milligramsPerDeciliter
  13. }
  14. }
  15. static func formatToLocalizedString(_ value: Double, maxFractionDigits: Int = 1, minFractionDigits: Int = 0) -> String {
  16. let numberFormatter = NumberFormatter()
  17. numberFormatter.numberStyle = .decimal
  18. numberFormatter.maximumFractionDigits = maxFractionDigits
  19. numberFormatter.minimumFractionDigits = minFractionDigits
  20. numberFormatter.locale = Locale.current
  21. let numberValue = NSNumber(value: value)
  22. return numberFormatter.string(from: numberValue) ?? String(value)
  23. }
  24. static func formatQuantity(_ quantity: HKQuantity) -> String {
  25. let unit: HKUnit = getPreferredUnit()
  26. let value = quantity.doubleValue(for: unit)
  27. return formatToLocalizedString(value, maxFractionDigits: unit.preferredFractionDigits, minFractionDigits: unit.preferredFractionDigits)
  28. }
  29. static func formatQuantity(_ value: Double) -> String {
  30. formatQuantity(HKQuantity(unit: .milligramsPerDeciliter, doubleValue: value))
  31. }
  32. static func formatTimestampToLocalString(_ timestamp: TimeInterval) -> String {
  33. let date = Date(timeIntervalSince1970: timestamp)
  34. let dateFormatter = DateFormatter()
  35. dateFormatter.setLocalizedDateFormatFromTemplate("jms")
  36. dateFormatter.locale = Locale.current
  37. dateFormatter.timeZone = TimeZone.current
  38. return dateFormatter.string(from: date)
  39. }
  40. static func formatLocalDouble(_ value: Double, unit: String? = nil) -> String {
  41. let numberFormatter = NumberFormatter()
  42. numberFormatter.numberStyle = .decimal
  43. let units = unit ?? Storage.shared.units.value
  44. if units == "mg/dL" {
  45. numberFormatter.maximumFractionDigits = 0 // No decimal places for mg/dL
  46. } else {
  47. numberFormatter.maximumFractionDigits = 1 // Always one decimal place for mmol/L
  48. numberFormatter.minimumFractionDigits = 1 // This ensures even .0 is displayed
  49. }
  50. numberFormatter.locale = Locale.current
  51. let numberValue = NSNumber(value: value)
  52. return numberFormatter.string(from: numberValue) ?? String(value)
  53. }
  54. static func toDisplayUnits(_ value: String) -> String {
  55. let numberFormatter = NumberFormatter()
  56. numberFormatter.numberStyle = .decimal
  57. if Storage.shared.units.value == "mg/dL" {
  58. numberFormatter.maximumFractionDigits = 0 // No decimal places for mg/dL
  59. } else {
  60. numberFormatter.maximumFractionDigits = 1 // Always one decimal place for mmol/L
  61. numberFormatter.minimumFractionDigits = 1 // This ensures even .0 is displayed
  62. }
  63. numberFormatter.locale = Locale.current
  64. if let number = Float(value) {
  65. if Storage.shared.units.value == "mg/dL" {
  66. let numberValue = NSNumber(value: number)
  67. return numberFormatter.string(from: numberValue) ?? value
  68. } else {
  69. let mmolValue = Double(number) * GlucoseConversion.mgDlToMmolL // Convert number to Double
  70. let numberValue = NSNumber(value: mmolValue)
  71. return numberFormatter.string(from: numberValue) ?? value
  72. }
  73. }
  74. return value
  75. }
  76. static func removePeriodAndCommaForBadge(_ value: String) -> String {
  77. var modifiedValue = value
  78. modifiedValue = modifiedValue.replacingOccurrences(of: ".", with: "")
  79. modifiedValue = modifiedValue.replacingOccurrences(of: ",", with: "")
  80. return modifiedValue
  81. }
  82. }
  83. extension Float {
  84. // remove the decimal part of the float if it is ".0" and trim whitespaces
  85. var cleanValue: String {
  86. return truncatingRemainder(dividingBy: 1) == 0
  87. ? String(format: "%5.0f", self).trimmingCharacters(in: CharacterSet.whitespaces)
  88. : String(format: "%5.1f", self).trimmingCharacters(in: CharacterSet.whitespaces)
  89. }
  90. var roundTo3f: Float {
  91. return round(to: 3)
  92. }
  93. func round(to places: Int) -> Float {
  94. let divisor = pow(10.0, Float(places))
  95. return (divisor * self).rounded() / divisor
  96. }
  97. }