Formatters.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import Foundation
  2. import HealthKit
  3. enum Formatters {
  4. static func percent(for number: Double) -> String {
  5. let formater = NumberFormatter()
  6. formater.numberStyle = .percent
  7. return formater.string(for: number)!
  8. }
  9. static func timeFor(minutes: Int) -> String {
  10. let formater = DateComponentsFormatter()
  11. formater.unitsStyle = .abbreviated
  12. formater.allowedUnits = [.hour, .minute]
  13. return formater.string(from: TimeInterval(minutes * 60))!
  14. }
  15. }
  16. extension Formatter {
  17. static let iso8601withFractionalSeconds: ISO8601DateFormatter = {
  18. let formatter = ISO8601DateFormatter()
  19. formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
  20. return formatter
  21. }()
  22. static let iso8601: ISO8601DateFormatter = {
  23. let formatter = ISO8601DateFormatter()
  24. formatter.formatOptions = [.withInternetDateTime]
  25. return formatter
  26. }()
  27. static let decimalFormatterWithTwoFractionDigits: NumberFormatter = {
  28. let formatter = NumberFormatter()
  29. formatter.numberStyle = .decimal
  30. formatter.maximumFractionDigits = 2
  31. return formatter
  32. }()
  33. static let dateFormatter: DateFormatter = {
  34. let dateFormatter = DateFormatter()
  35. dateFormatter.timeStyle = .short
  36. return dateFormatter
  37. }()
  38. static let dayFormatter: DateFormatter = {
  39. let formatter = DateFormatter()
  40. formatter.dateFormat = "d"
  41. return formatter
  42. }()
  43. static let decimalFormatterWithOneFractionDigit: NumberFormatter = {
  44. let formatter = NumberFormatter()
  45. formatter.numberStyle = .decimal
  46. formatter.maximumFractionDigits = 1
  47. return formatter
  48. }()
  49. static let integerFormatter: NumberFormatter = {
  50. let formatter = NumberFormatter()
  51. formatter.numberStyle = .decimal
  52. formatter.maximumFractionDigits = 0
  53. return formatter
  54. }()
  55. static func glucoseFormatter(for units: GlucoseUnits) -> NumberFormatter {
  56. let formatter = NumberFormatter()
  57. formatter.numberStyle = .decimal
  58. formatter.roundingMode = .halfUp
  59. switch units {
  60. case .mmolL:
  61. formatter.maximumFractionDigits = 1
  62. case .mgdL:
  63. formatter.maximumFractionDigits = 0
  64. }
  65. return formatter
  66. }
  67. static let bolusFormatter: NumberFormatter = {
  68. let formatter = NumberFormatter()
  69. formatter.numberStyle = .decimal
  70. formatter.minimumIntegerDigits = 0
  71. formatter.maximumFractionDigits = 2
  72. formatter.decimalSeparator = "."
  73. return formatter
  74. }()
  75. }
  76. extension JSONDecoder.DateDecodingStrategy {
  77. static let customISO8601 = custom {
  78. let container = try $0.singleValueContainer()
  79. let string = try container.decode(String.self)
  80. if let date = Formatter.iso8601withFractionalSeconds.date(from: string) ?? Formatter.iso8601.date(from: string) {
  81. return date
  82. }
  83. throw DecodingError.dataCorruptedError(in: container, debugDescription: "Invalid date: \(string)")
  84. }
  85. }
  86. extension JSONEncoder.DateEncodingStrategy {
  87. static let customISO8601 = custom {
  88. var container = $1.singleValueContainer()
  89. try container.encode(Formatter.iso8601withFractionalSeconds.string(from: $0))
  90. }
  91. }