Localizer.swift 4.3 KB

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