Просмотр исходного кода

Fix mmol/L decimal separator; introduce custom display formatter

Deniz Cengiz 1 год назад
Родитель
Сommit
a40de03fde

+ 23 - 0
FreeAPS/Sources/Models/BloodGlucose.swift

@@ -109,6 +109,10 @@ extension Int {
     var asMmolL: Decimal {
     var asMmolL: Decimal {
         FreeAPS.rounded(Decimal(self) * GlucoseUnits.exchangeRate, scale: 1, roundingMode: .plain)
         FreeAPS.rounded(Decimal(self) * GlucoseUnits.exchangeRate, scale: 1, roundingMode: .plain)
     }
     }
+
+    var formattedAsMmolL: String {
+        NumberFormatter.glucoseFormatter.string(from: asMmolL as NSDecimalNumber) ?? "\(asMmolL)"
+    }
 }
 }
 
 
 extension Decimal {
 extension Decimal {
@@ -119,6 +123,10 @@ extension Decimal {
     var asMgdL: Decimal {
     var asMgdL: Decimal {
         FreeAPS.rounded(self / GlucoseUnits.exchangeRate, scale: 0, roundingMode: .plain)
         FreeAPS.rounded(self / GlucoseUnits.exchangeRate, scale: 0, roundingMode: .plain)
     }
     }
+
+    var formattedAsMmolL: String {
+        NumberFormatter.glucoseFormatter.string(from: asMmolL as NSDecimalNumber) ?? "\(asMmolL)"
+    }
 }
 }
 
 
 extension Double {
 extension Double {
@@ -129,6 +137,21 @@ extension Double {
     var asMgdL: Decimal {
     var asMgdL: Decimal {
         FreeAPS.rounded(Decimal(self) / GlucoseUnits.exchangeRate, scale: 0, roundingMode: .plain)
         FreeAPS.rounded(Decimal(self) / GlucoseUnits.exchangeRate, scale: 0, roundingMode: .plain)
     }
     }
+
+    var formattedAsMmolL: String {
+        NumberFormatter.glucoseFormatter.string(from: asMmolL as NSDecimalNumber) ?? "\(asMmolL)"
+    }
+}
+
+extension NumberFormatter {
+    static let glucoseFormatter: NumberFormatter = {
+        let formatter = NumberFormatter()
+        formatter.locale = Locale.current
+        formatter.numberStyle = .decimal
+        formatter.minimumFractionDigits = 1
+        formatter.maximumFractionDigits = 1
+        return formatter
+    }()
 }
 }
 
 
 extension BloodGlucose: SavitzkyGolaySmoothable {
 extension BloodGlucose: SavitzkyGolaySmoothable {

+ 1 - 2
FreeAPS/Sources/Modules/Bolus/View/ForeCastChart.swift

@@ -45,8 +45,7 @@ struct ForeCastChart: View {
                 if let eventualBG = state.simulatedDetermination?.eventualBG {
                 if let eventualBG = state.simulatedDetermination?.eventualBG {
                     HStack {
                     HStack {
                         Text(
                         Text(
-                            glucoseFormatter
-                                .string(from: (units == .mgdL ? Decimal(eventualBG) : eventualBG.asMmolL) as NSNumber) ?? "--"
+                            units == .mgdL ? Decimal(eventualBG).description : eventualBG.asMmolL.formattedAsMmolL
                         )
                         )
                         .font(.footnote)
                         .font(.footnote)
                         .foregroundStyle(.primary)
                         .foregroundStyle(.primary)

+ 1 - 1
FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift

@@ -385,7 +385,7 @@ extension MainChartView {
                 }.font(.body).padding(.bottom, 5)
                 }.font(.body).padding(.bottom, 5)
 
 
                 HStack {
                 HStack {
-                    Text(glucoseToShow.description)
+                    Text(units == .mgdL ? glucoseToShow.description : glucoseToShow.formattedAsMmolL)
                         .bold()
                         .bold()
                         + Text(" \(units.rawValue)")
                         + Text(" \(units.rawValue)")
                 }.foregroundStyle(
                 }.foregroundStyle(

+ 3 - 2
FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift

@@ -84,9 +84,10 @@ struct CurrentGlucoseView: View {
                 VStack(alignment: .center) {
                 VStack(alignment: .center) {
                     HStack {
                     HStack {
                         if let glucoseValue = combinedGlucoseValues.first?.glucose {
                         if let glucoseValue = combinedGlucoseValues.first?.glucose {
-                            let displayGlucose = units == .mgdL ? Decimal(glucoseValue) : Decimal(glucoseValue).asMmolL
+                            let displayGlucose = units == .mgdL ? Decimal(glucoseValue).description : Decimal(glucoseValue)
+                                .asMmolL.formattedAsMmolL
                             Text(
                             Text(
-                                glucoseValue == 400 ? "HIGH" : displayGlucose.description
+                                glucoseValue == 400 ? "HIGH" : displayGlucose
                             )
                             )
                             .font(.system(size: 40, weight: .bold, design: .rounded))
                             .font(.system(size: 40, weight: .bold, design: .rounded))
                             .foregroundColor(alarm == nil ? colourGlucoseText : .loopRed)
                             .foregroundColor(alarm == nil ? colourGlucoseText : .loopRed)

+ 2 - 2
FreeAPS/Sources/Modules/OverrideConfig/View/OverrideRootView.swift

@@ -50,7 +50,7 @@ extension OverrideConfig {
             formatter.maximumFractionDigits = 0
             formatter.maximumFractionDigits = 0
             return formatter
             return formatter
         }
         }
-        
+
         var body: some View {
         var body: some View {
             VStack {
             VStack {
                 Picker("Tab", selection: $state.selectedTab) {
                 Picker("Tab", selection: $state.selectedTab) {
@@ -439,7 +439,7 @@ extension OverrideConfig {
 
 
         @ViewBuilder private func overridesView(for preset: OverrideStored) -> some View {
         @ViewBuilder private func overridesView(for preset: OverrideStored) -> some View {
             let target = (state.units == .mgdL ? preset.target : preset.target?.decimalValue.asMmolL as NSDecimalNumber?) ?? 0
             let target = (state.units == .mgdL ? preset.target : preset.target?.decimalValue.asMmolL as NSDecimalNumber?) ?? 0
-            
+
             let duration = (preset.duration ?? 0) as Decimal
             let duration = (preset.duration ?? 0) as Decimal
             let name = ((preset.name ?? "") == "") || (preset.name?.isEmpty ?? true) ? "" : preset.name!
             let name = ((preset.name ?? "") == "") || (preset.name?.isEmpty ?? true) ? "" : preset.name!
             let percent = preset.percentage / 100
             let percent = preset.percentage / 100