Localizer.swift 4.4 KB

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