Как ввести формат валюты в текстовое поле (справа налево) с помощью Swift?

У меня есть номер, скажем, 0.00 .

  • Когда пользователь забирает 1. У нас должно быть 0.01
  • Когда пользователь забирает 2. Мы должны отображать 0.12
  • Когда пользователь забирает 3. Мы должны отображать 1.23
  • Когда пользователь забирает 4. Мы должны отобразить 12.34

Как я могу сделать это с помощью Swift?

Для Свифта 3 . Формат входной валюты в текстовом поле (справа налево)

 override func viewDidLoad() { super.viewDidLoad() textField.addTarget(self, action: #selector(myTextFieldDidChange), for: .editingChanged) } func myTextFieldDidChange(_ textField: UITextField) { if let amountString = textField.text?.currencyInputFormatting() { textField.text = amountString } } extension String { // formatting text for currency textField func currencyInputFormatting() -> String { var number: NSNumber! let formatter = NumberFormatter() formatter.numberStyle = .currencyAccounting formatter.currencySymbol = "$" formatter.maximumFractionDigits = 2 formatter.minimumFractionDigits = 2 var amountWithPrefix = self // remove from String: "$", ".", "," let regex = try! NSRegularExpression(pattern: "[^0-9]", options: .caseInsensitive) amountWithPrefix = regex.stringByReplacingMatches(in: amountWithPrefix, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count), withTemplate: "") let double = (amountWithPrefix as NSString).doubleValue number = NSNumber(value: (double / 100)) // if first number is 0 or all numbers were deleted guard number != 0 as NSNumber else { return "" } return formatter.string(from: number)! } } 

Вы можете создать подклассы UITextField для текстового поля в валюте. Добавить цель для UIControlEvents .editingChanged. Добавьте метод выбора для фильтрации цифр из строки текстового поля. После фильтрации всех ненужных цифр из вашей строки вы можете форматировать свой номер с помощью NumberFormatter следующим образом:

Xcode 8.3.2 • Swift 3.1

 class CurrencyField: UITextField { var string: String { return text ?? "" } var decimal: Decimal { return string.digits.decimal / Decimal(pow(10, Double(Formatter.currency.maximumFractionDigits))) } var decimalNumber: NSDecimalNumber { return decimal.number } var doubleValue: Double { return decimalNumber.doubleValue } var integerValue: Int { return decimalNumber.intValue } let maximum: Decimal = 999_999_999.99 private var lastValue: String = "" override func willMove(toSuperview newSuperview: UIView?) { // you can make it a fixed locale currency if if needed // Formatter.currency.locale = Locale(identifier: "pt_BR") // or "en_US", "fr_FR", etc addTarget(self, action: #selector(editingChanged), for: .editingChanged) keyboardType = .numberPad textAlignment = .right editingChanged() } override func deleteBackward() { text = string.digits.dropLast().string editingChanged() } func editingChanged() { guard decimal <= maximum else { text = lastValue return } lastValue = Formatter.currency.string(for: decimal) ?? "" text = lastValue print("integer:", integerValue) print("double:", doubleValue) print("decimal:", decimal) print("currency:", lastValue) } } 

 extension NumberFormatter { convenience init(numberStyle: Style) { self.init() self.numberStyle = numberStyle } } extension Formatter { static let currency = NumberFormatter(numberStyle: .currency) } extension String { var digits: [UInt8] { return characters.flatMap{ UInt8(String($0)) } } } extension Collection where Iterator.Element == UInt8 { var string: String { return map(String.init).joined() } var decimal: Decimal { return Decimal(string: string) ?? 0 } } extension Decimal { var number: NSDecimalNumber { return NSDecimalNumber(decimal: self) } } 

Попробуйте этот фрагмент кода:

 struct DotNum { private var fraction:String = "" private var intval:String = "" init() {} mutating func enter(s:String) { if count(fraction) < 2 { fraction = s + fraction } else { intval = s + intval } } private var sFract:String { if count(fraction) == 0 { return "00" } if count(fraction) == 1 { return "0\(fraction)" } return fraction } var stringVal:String { if intval == "" { return "0.\(sFract)" } return "\(intval).\(sFract)" } } var val = DotNum() val.enter("1") val.stringVal val.enter("2") val.stringVal val.enter("3") val.stringVal val.enter("4") val.stringVal 

Мой окончательный код спасибо за вашу помощь

 extension Double { var twoDigits: Double { let nf = NSNumberFormatter() nf.numberStyle = NSNumberFormatterStyle.DecimalStyle nf.minimumFractionDigits = 2 nf.maximumFractionDigits = 2 return self } } var cleanText:String! let number:String = sender.currentTitle as String! if(amountDisplay.text != nil) { cleanText = String(Array(amountDisplay.text!).map{String($0)}.filter{ $0.toInt() != nil }.map{Character($0)} ) as String cleanText = cleanText + number }else{ cleanText = number } amount = (Double(cleanText.toInt()!) / 100).twoDigits formatter.locale = NSLocale(localeIdentifier: currencies[current_currency_index]) amountDisplay.text = "\(formatter.stringFromNumber(amount!)!)" 
  • Могу ли я изменить свойство UIReturnKeyType UITextField динамически?
  • iOS - Как установить текстовое поле намека на курсив (с регулярным фактическим текстом)?
  • _UIButtonBarStackView: ограничение прерывания при отправке startFirstответчика
  • iPhone: как перечислить через UITextFields
  • TextField в AlertView не отображается на iOS 7
  • Префикс статического символа в UITextField
  • Изменение высоты пользовательского вводаView при повороте устройства
  • внедрение ввода текстового поля, например, ввода данных atm
  • Swift UITextField deleteBackward Issue
  • UITextView InputView Автокоррекция и автокапитализация
  • Как отменить клавиатуру IOS программно
  • Давайте будем гением компьютера.