Как отформатировать клавиатуру, чтобы всегда было "."точка вместо "," запятая - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть textFields, который содержит широту и долготу, и мне нужно всегда иметь на клавиатуре десятичной панели точку "."вместо запятой "," потому что, если регион iPhone пользователя не США или, например, Украина на клавиатуре десятичной клавиатуры, у меня запятая ",", и мое приложение падает.Как реализовать NumberFormatter, чтобы всегда иметь точку "."

Файл Swift для преобразования координат DMM текста textField формы в DM

import Foundation
import MapKit

func DMMtoDD(latDeg: Double, latMin: Double, latDir: String?, longDeg:    Double, longMin: Double, longDir: String?) -> CLLocationCoordinate2D {
var latitude = CLLocationDegrees()
if latDeg > 0 {
    latitude = CLLocationDegrees(latDeg + ((latMin*60)/3600))
    if latDir == "S" {latitude *= -1}
}
else{
    latitude = CLLocationDegrees((latDeg * -1) + ((latMin*60)/3600))
    latitude *= -1
}
var longitude = CLLocationDegrees()
if longDeg > 0 {
    longitude = CLLocationDegrees(longDeg + ((longMin*60)/3600))
    if longDir == "W" {longitude *= -1}
}
else{
    longitude = CLLocationDegrees((longDeg * -1) + ((longMin*60)/3600))
    longitude *= -1
}
return CLLocationCoordinate2D(latitude: latitude, longitude: longitude)

}

ViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    let resultsVC = segue.destination as! ResultsViewController
    let coord = DMMtoDD(latDeg: Double(latDegTextField.text!)!, latMin:      Double(latMinutesTextField.text!)!, latDir: String(latPTextField.text!),    longDeg: Double(longDegTextField.text!)!, longMin: Double(longMinutesTextField.text!)!, longDir: String(longPTextField.text!))
}

// КакЯ использую координаты в моем коде

let G16 = (tghaSun + coord.longitude).truncatingRemainder(dividingBy: 360.0)

1 Ответ

1 голос
/ 25 сентября 2019

Я предполагаю, что вы анализируете то, что пользователь ввел, как это:

let longitude = CLLocationDegrees(whatTheUserEntered)

Если языковой стандарт клавиатуры пользователя был установлен на тот, который использует , в качестве десятичного разделителя, whatTheUserEnteredбудет содержать что-то вроде 1,23, и приведенная выше строка не будет правильно анализировать число.Правильно ли я понял?

Вместо того, чтобы пытаться изменить клавиатуру для отображения ., измените способ синтаксического анализа номера, чтобы разрешить использование ,, в зависимости от локали пользователя.

Используйте NumberFormatter:

let numberFormatter = NumberFormatter()
// numberFormatter takes the current locale into consideration by default
let longitude = numberFormatter.number(from: whatTheUserEntered).map { CLLocationDegrees($0) }

Вы можете установить numberFormatter.locale на Locale(identifier: "uk") (или другую локаль, которая использует , в качестве десятичного разделителя), чтобы проверить, что это работает:

numberFormatter.locale = Locale(identifier: "uk")
...