Localizer.swift 4.4 KB

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