我正在开发一个贷款应用程序,我正在努力弄清楚如何在用户输入后立即格式化文本字段。很高兴看到,因为只要文本字段中有数字,就会计算输出。
在我的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中根据我当前的设置来做到这一点。感谢任何有用的提示!!
答案 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
它将起作用,因为您正在显示格式化数字