0

Я использую измененный метод для this, где я хочу отформатировать UITextField при вводе пользователем номера. Как и в случае, я хочу, чтобы число было в живом формате. Я хочу изменить 1000 до 1000, от 50000 до 50 000 и так далее.Добавление запятых в числовые значения как типы пользователей в UITextField

Моя проблема в том, что мои значения UITextField не обновляются, как ожидалось. Например, когда я печатаю 50000 в UITextField, результат возвращается как 5,0000 вместо 50 000. Вот мой код:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    //check if any numbers in the textField exist before editing 
    guard let textFieldHasText = (textField.text), !textFieldHasText.isEmpty else { 
     //early escape if nil 
     return true 
    } 

    let formatter = NumberFormatter() 
    formatter.numberStyle = NumberFormatter.Style.decimal 

    //remove any existing commas 
    let textRemovedCommma = textFieldHasText.replacingOccurrences(of: ",", with: "") 

    //update the textField with commas 
    let formattedNum = formatter.string(from: NSNumber(value: Int(textRemovedCommma)!)) 
    textField.text = formattedNum 
    return true 
} 
+0

http://stackoverflow.com/questions/24115141/swift-converting-string-to-int/34294660?s=1|0.1034#34294660 –

ответ

2

Правило номер 1 из shouldChangeCharactersIn - Если присвоить значение text собственности текстового поля необходимо вернуть false. Возврат true сообщает текстовому полю, чтобы внести первоначальное изменение в текст, который вы уже изменили. Это не то, что вы хотите.

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

+0

Спасибо - я не понимаю, что я использовал истинный/false возвращаются неправильно. И спасибо, что поймали проблему локали. Я постараюсь это исправить, и я отчитаю! – Sami

1

Попробуйте использовать NSNumberFormatter.

var currencyFormatter = NumberFormatter() 
currencyFormatter.usesGroupingSeparator = true 
currencyFormatter.numberStyle = .currency 
// localize to your grouping and decimal separator 
currencyFormatter.locale = NSLocale.current 
var priceString = currencyFormatter.string(from: 9999.99) 

Это напечатает значение, как = "$ 9,999.99"

Вы также можете установить Locale в соответствии с вашими потребностями.

0
let formatter = NumberFormatter() 
formatter.numberStyle = NumberFormatter.Style.decimal 
let textRemovedCommma = textField.text?.replacingOccurrences(of: ",", with: "") 
let formattedNum = formatter.string(from: NSNumber(value: Int(textRemovedCommma!)!)) 
textField.text = formattedNum 
+0

Эй, там! Хотя этот фрагмент кода может быть решением, [включая объяснение] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – wing

Смежные вопросы