Форматирование UITextField как цены (XXX,XXX.XX)

Я рвал на себе волосы, пытаясь найти решение этой проблемы.

Я просто хочу, чтобы UITextField правильно форматировал введенное число как цену. Это означает, что разрешена только одна десятичная точка, две цифры после точки (если они были введены) и ',' для разделения больших чисел (например, 150 000).

Вот как правильно форматируется цена, так почему же так трудно сделать правильный выбор?

Ближе всего я пришел к решению этот код. Однако проблема с ним заключается в том, что после ввода четырех цифр он возвращается к 0 ?? Это близко к решению, я просто не могу понять, почему оно ведет себя так странно.


person Andrew Davis    schedule 08.09.2011    source источник
comment
Быстрый вопрос: вы хотите изменить его, когда пользователь пишет, или после нажатия Enter/Next?   -  person Can    schedule 09.09.2011
comment
Как пользователь меняет его (в режиме реального времени).   -  person Andrew Davis    schedule 09.09.2011
comment
stackoverflow.com/questions/51790888/   -  person Hos Ap    schedule 12.08.2018


Ответы (2)


На самом деле вам не нужен код для этого. Просто перетащите средство форматирования чисел в текстовое поле в файле пера и настройте его для использования стиля «Валюта».

Через код это будет [myNumberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]

Имейте в виду, что формат цен сильно различается в зависимости от региона. Например, в Германии точка используется как разделитель тысяч, а запятая — как десятичная точка. Использование стиля вместо фиксированного формата позаботится об этих различиях.

person omz    schedule 08.09.2011
comment
Err, где мне найти средство форматирования чисел для перетаскивания. я не вижу? Во-вторых, будет ли он обновлять число, когда произойдет shouldChangeCharactersInRange? - person Andrew Davis; 09.09.2011
comment
Я не видел вашего требования об обновлении отформатированного номера в реальном времени. Мой ответ вам в этом случае не поможет, извините. - person omz; 09.09.2011

Привет Вот мое решение.

import UIKit


extension Numeric {   // for Swift 3 use FloatingPoint or Int

    func currency(locale: String, symbol: Bool = true) -> String {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.locale = Locale(identifier: locale)
        if !symbol {
            formatter.currencySymbol = ""
        }
        let result = formatter.string(for: self) ?? ""

        return result
    }

}

Код ViewController

var price: String!
var priceNumber: CGFloat!
@IBOutlet weak var priceInput: UITextField!

ViewDidLoad

priceInput.addTarget(self, action: #selector(priceInputChanged), for: .editingChanged)
priceInput.tintColor = .clear

priceInput.delegate = self

UITextFieldDelegate в вашем ViewController

@objc func priceInputChanged(_ textField: UITextField){

    if localIdentifier != nil {
        priceInput.text = priceNumber.currency(locale: localIdentifier, symbol: false)
    }
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if textField.tag == 3 {

        if string.isEmpty {
            if price.count > 0 {
                let last = price.removeLast()
                if last == "." {
                    if price.count > 0 {
                        price.removeLast()
                    }
                }
            }

        }else {
            price.append(string)
        }

        if let input = price {
            let n = NumberFormatter().number(from: input) ?? 0
            priceNumber = CGFloat(truncating: n)

            if localIdentifier != nil {
                priceInput.text = priceNumber.currency(locale: localIdentifier, symbol: false)
            }

        }

    }

    return true
}

Это оно

person Shawn Baek    schedule 05.02.2018