Нужны как Цельсий, так и Фаренгейт с WeatherKit

У меня есть погодное приложение, которое показывает температуру в градусах Цельсия и Фаренгейта одновременно. Я хотел бы использовать WeatherKit, но у меня возникли проблемы с округлением градусов Цельсия до десятичных знаков. Я могу сделать это с Фаренгейтом с .formatted, потому что я живу в США, но я не могу одновременно округлять по Цельсию. Есть ли простой способ сделать это в SwiftUI? Или можно вручную установить локаль только для одного свойства?

                  if let weather{
                
                let celsiusWeather = weather.currentWeather.temperature.converted(to: .celsius).description
                
                
                VStack{
                    Text("New York")
                        .font(.largeTitle)
                    Text("\(weather.currentWeather.temperature.converted(to: .fahrenheit).formatted().description)")
                    Text(celsiusWeather)
                }
            }
        }

Этот текущий код подходит к нему наполовину:

Нью-Йорк 45°F 5,98°C

Но я бы хотел, чтобы вместо этого было просто 6°C. Я пробовал интерполяцию строк:

let celsiusFormatted = String(format: "%.0f", celsiusWeather)

и это только что выдало 0, даже не температуру, так что я не уверен, может ли он это сделать из-за WeatherKit или нет.

Любая помощь будет здорово. Дайте мне знать, если вам нужно больше кода, чтобы уточнить.

2 ответа

Вы можете отформатировать температуру, используяMeasurementFormatter. Не забудьте установитьnumberFormatter.maximumFractionDigits = 0округлить число до необходимого иunitOptions = .providedUnitчтобы убедиться, что отображаются правильные единицы измерения.

      struct ContentView: View {
    
    let temp: Measurement<UnitTemperature>
    
    var body: some View {
        VStack {
            HStack {
                Text("New York")
                Text(temp, formatter: formatter)
                Text(temp.converted(to: .celsius), formatter: formatter)
            }
        }
    }
    
    var formatter: MeasurementFormatter {
        let formatter = MeasurementFormatter()
        formatter.unitStyle = .medium
        formatter.numberFormatter.maximumFractionDigits = 0
        formatter.unitOptions = .providedUnit
        return formatter
    }
}

Пытаться

      let celsiusFormatted = String(format: "%.0f", celsiusWeather.value)

celsiusWeatherпредставляется измерением, а неvalueизмерения представляет собойDouble.

Вы также можете включить точность дляText

      Text(weather.currentWeather.temperature.converted(to: .celsius), format: .measurement(width: .abbreviated, usage: .asProvided,numberFormatStyle: .number.precision(.fractionLength(2))))
Другие вопросы по тегам