Swift, преобразовывая число в строку, число округляется в меньшую сторону - PullRequest
0 голосов
/ 14 июля 2020

У меня небольшая проблема с моим кодом ... прямо сейчас я передаю строку, содержащую кучу чисел, для преобразования в число, добавляются разделители запятых, а затем конвертируется обратно в строку для вывода . Когда я добавляю десятичную дробь к своей строке и передаю ее, число вроде 996.3658 обрезается до 996.366 ...

«currentNumber» - это мое входное значение, «textOutputToScreen» - это мой результат ...

func formatNumber() {

    let charset = CharacterSet(charactersIn: ".")

    if let _ = currentNumber.rangeOfCharacter(from: charset) {
        if let number = Float(currentNumber) {

            let numberFormatter = NumberFormatter()
            numberFormatter.numberStyle = .decimal
            guard let formattedNumber = numberFormatter.string(from: NSNumber(value: number)) else { return }
            textOutputToScreen = String(formattedNumber)
        }
    }
    else {
        if let number = Int(currentNumber) {

            let numberFormatter = NumberFormatter()
            numberFormatter.numberStyle = .decimal
            guard let formattedNumber = numberFormatter.string(from: NSNumber(value: number)) else { return }
            textOutputToScreen = String(formattedNumber)
        }
    }   
}

Заранее благодарю за помощь!

1 Ответ

3 голосов
/ 14 июля 2020

Проблема в том, что вы должны установить для NumberFormatter minimumFractionDigits значение 4. Между прочим, нет необходимости инициализировать объект NSNumber. Вы можете использовать метод Formatters string (for: Any) и передать свой Float. Кстати, я бы использовал Double (64-битный) вместо Float (32-битный), и нет необходимости инициализировать новую строку g из вашего объекта formattedNumber. Это уже строка.

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

extension Formatter {
    static let number: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        return formatter
    }()
}
func formatNumber(from string: String) -> String? {
    if string.contains(".") {
        guard let value = Double(string) else { return nil }
        Formatter.number.minimumFractionDigits = 4
        return Formatter.number.string(for: value)
    } else {
        guard let value = Int(string) else { return nil }
        Formatter.number.minimumFractionDigits = 0
        return Formatter.number.string(for: value)
    }
}
let label = UILabel()
let currentNumber = "996.3658"
label.text = formatNumber(from: currentNumber)  // "996.3658\n"

Если вы хотите присвоить результат переменной вместо метки

if let formatted = formatNumber(from: currentNumber) {
    textOutputToScreen = formatted
}
...