Localizer.swift 4.2 KB

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