作为用户类型,在Swift中使用NSNumberFormatter扩展名格式化文本字段

时间:2014-12-30 16:01:08

标签: ios swift uitextfield nsnumberformatter uitextfielddelegate

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

在我的ViewController中:

  @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)!
  }
}

我的问题是由于我缺乏经验。如何使用我的扩展格式化贷款的文本字段($ currency,2个小数和分组分隔符)和利率(始终为3个小数,因为它是增量的1/8)。我看到了其他的shouldChangeCharactersInRange方法或者有一些空白的UILabel来显示格式化的文本......但是我不确定如何在Swift中根据我当前的设置来做到这一点。感谢任何有用的提示!!

1 个答案:

答案 0 :(得分:0)

我正在制作一个计算器应用程序,在显示器中我想在用NSNumberFormatterStyle.DecimalStyle键入用户时格式化数字,所以当用户按下 1 时,我的代码就像这样:< / p>

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这样的数字后,它给了我一个错误。

现在我理解formatNumber不再是数字的错误,因此它给出了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的,,NSNumber保留了一个可以格式化为你想要的次数。

并且您可以为textField设置最大数量,如下所示:

formatter.maximumIntegerDigits = 12

它将起作用,因为您正在显示格式化数字