【问题标题】:As user types, format text field with NSNumberFormatter extension in Swift作为用户类型,在 Swift 中使用 NSNumberFormatter 扩展格式化文本字段
【发布时间】:2014-12-30 16:01:07
【问题描述】:

我正在开发一个贷款应用程序,我正在努力弄清楚如何在用户输入后立即格式化文本字段。很高兴看到这一点,因为只要文本字段中有数字,就会计算输出。

在我的视图控制器中:

  @IBOutlet var loanTextField: UITextField!
  @IBOutlet var interestTextField: UITextField!
  @IBOutlet var interestStepper: UIStepper!
  @IBOutlet var termTextField: UITextField!
  @IBOutlet var termStepper: UIStepper!

创建了代表来构造最大长度并在适用时允许小数:

  var integerTextFieldDelegate = NumericTextFieldDelegate(maxLength: 2)
  var loanTextFieldDelegate = NumericTextFieldDelegate(maxLength: 10, allowDecimal: true)
  var interestRateTextFieldDelegate = NumericTextFieldDelegate(maxLength: 2, allowDecimal: true)

为 viewDidLoad 中的每个文本字段定义委托:

loanTextField.text = ""
loanTextField.delegate = loanTextFieldDelegate

interestRateTextField.setTextNumericValue(DefaultInterestRate)
interestRateTextField.delegate = interestRateTextFieldDelegate

termTextField.setTextNumericValue(DefaultTerm)
termTextField.delegate = interestRateTextFieldDelegate

NumericTextFieldDelegate 引用了一个扩展:

// Implementation of UITextFieldDelegate that prevents non-numeric characters
// from being entered in a numeric text field.
public class NumericTextFieldDelegate: NSObject, UITextFieldDelegate {
  let maxLength: Int
  let allowDecimal: Bool

  public init(maxLength: Int, allowDecimal: Bool = false) {
    self.maxLength = maxLength
    self.allowDecimal = allowDecimal
  }

  public func textField(textField: UITextField!,
    shouldChangeCharactersInRange range: NSRange,
    replacementString string: String!) -> Bool
  {
    let originalText: NSString = textField.text
    let proposedText: NSString = originalText.stringByReplacingCharactersInRange(range, withString: string)

    let proposedLength = proposedText.length
    if proposedLength > maxLength {
      return false
    }

    if allowDecimal {
      if proposedLength > 0 && !isValidDoubleString(proposedText) {
        return false
      }
    }
    else {
      if proposedLength > 0 && !isValidIntegerString(proposedText) {
        return false
      }
    }

    return true
  }
}

我还有一个数字格式化扩展:

public extension Double {
  var formatted: String {
    let formatter = NSNumberFormatter()
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    formatter.currencyGroupingSeparator?
    formatter.minimumFractionDigits = 2
    formatter.maximumFractionDigits = 2
    return formatter.stringFromNumber(self)!
  }
}

我的问题是由于我缺乏经验。如何使用我的扩展设置贷款($ 货币、2 位小数和分组分隔符)和利率(始终为 3 位小数,因为它以 1/8 为增量)的文本字段格式。我看到了其他的 shouldChangeCharactersInRange 方法,或者有一些空白的 UILabel 来显示格式化的文本……但鉴于我目前的设置,我不确定如何在 Swift 中执行此操作。感谢您提供任何有用的提示!

【问题讨论】:

    标签: ios swift uitextfield nsnumberformatter uitextfielddelegate


    【解决方案1】:

    我正在制作一个计算器应用程序,我想在用户使用NSNumberFormatterStyle.DecimalStyle 输入时格式化数字,所以当用户按下 1 时我的代码是这样的:

    var addOne:Character = "1"
    userInput.text.append(addOne)
    var formatNumber:NSNumber = userInput.text.toInt()!
    
    var formatter = NSNumberFormatter()
    formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
    var formattedNumber = formatter.stringFromNumber(formatNumber)!
    
    userInput.text = "\(formattedNumber)"
    

    但它并没有很好地工作,因为在格式化像 1,111 这样的数字后它给了我一个错误。

    现在我理解了 formattedNumber 不再是数字的错误,因此它给出了 nil 值。为了解决这个问题,我编写了这段代码:

    var addOne:Character = "1"
    userInput.text.append(addOne)
    
    var getString:NSString = input.text
    var newString = getString.stringByReplacingOccurrencesOfString(",", withString: "")
    
    var formatNumber:NSNumber = newString.toInt()!
    
    var formatter = NSNumberFormatter()
    formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
    var formattedNumber = formatter.stringFromNumber(formatNumber)!
    
    userInput.text = "\(formattedNumber)"
    

    它删除了 NSNumber 的 ,s,并且 NSNumber 保留了一个可以任意多次格式化的数字。

    您可以像这样为您的 textField 设置最大数量:

    formatter.maximumIntegerDigits = 12

    它会起作用,因为您显示的是格式化数字

    【讨论】:

      猜你喜欢
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多