在input的Swift中,在textfield中格式化货币
我想在用户input时在Swift的文本框中设置货币input的格式。
到目前为止,我只能在用户input完成后才能成功格式化:
@IBAction func editingEnded(sender: AnyObject) { let formatter = NSNumberFormatter() formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle formatter.locale = NSLocale(localeIdentifier: "en_US") var numberFromField = NSString(string: textField.text).doubleValue textField.text = formatter.stringFromNumber(numberFromField) }
不过,我希望货币在用户input的时候进行格式化。 当我尝试在TextField操作“Editing Changed”或“Value Changed”上进行操作时,我只能input1个数字(如果input8,则变为$ 8.00),但是一旦input第二个数字,除此之外不能进一步进入。
有什么build议么? 我觉得这应该是一个简单的解决办法,但我不能完全了解它。
我今天早些时候修改了function。 适用于“en_US”和“fr_FR”。 然而,对于“ja_JP”,由100我除去创build小数是一个问题。 您将需要有一个开关或if / else语句分隔货币小数和格式化格式时没有他们。 但是我认为这会让你进入你想要的空间。
import UIKit class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var textField: UITextField! var currentString = "" override func viewDidLoad() { super.viewDidLoad() self.textField.delegate = self } //Textfield delegates func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { // return NO to not change text switch string { case "0","1","2","3","4","5","6","7","8","9": currentString += string println(currentString) formatCurrency(string: currentString) default: var array = Array(string) var currentStringArray = Array(currentString) if array.count == 0 && currentStringArray.count != 0 { currentStringArray.removeLast() currentString = "" for character in currentStringArray { currentString += String(character) } formatCurrency(string: currentString) } } return false } func formatCurrency(#string: String) { println("format \(string)") let formatter = NSNumberFormatter() formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle formatter.locale = NSLocale(localeIdentifier: "en_US") var numberFromField = (NSString(string: currentString).doubleValue)/100 textField.text = formatter.stringFromNumber(numberFromField) println(textField.text ) } }
这对我使用NSNumberFormatter …
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { // Construct the text that will be in the field if this change is accepted var oldText = textField.text as NSString var newText = oldText.stringByReplacingCharactersInRange(range, withString: string) as NSString! var newTextString = String(newText) let digits = NSCharacterSet.decimalDigitCharacterSet() var digitText = "" for c in newTextString.unicodeScalars { if digits.longCharacterIsMember(c.value) { digitText.append(c) } } let formatter = NSNumberFormatter() formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle formatter.locale = NSLocale(localeIdentifier: "en_US") var numberFromField = (NSString(string: digitText).doubleValue)/100 newText = formatter.stringFromNumber(numberFromField) textField.text = newText return false }
基于@Robert的答案。 更新了Swift 2.0
//Textfield delegates func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { // return NO to not change text switch string { case "0","1","2","3","4","5","6","7","8","9": currentString += string formatCurrency(currentString) default: if string.characters.count == 0 && currentString.characters.count != 0 { currentString = String(currentString.characters.dropLast()) formatCurrency(currentString) } } return false } func formatCurrency(string: String) { print("format \(string)") let formatter = NSNumberFormatter() formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle formatter.locale = NSLocale(localeIdentifier: "en_US") let numberFromField = (NSString(string: currentString).doubleValue)/100 self.amountField.text = formatter.stringFromNumber(numberFromField) print(self.amountField.text ) }
对于Swift 3.0
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // Construct the text that will be in the field if this change is accepted switch string { case "0","1","2","3","4","5","6","7","8","9": currentString += string formatCurrency(currentString) default: if string.characters.count == 0 && currentString.characters.count != 0 { currentString = String(currentString.characters.dropLast()) formatCurrency(currentString) } } return false } func formatCurrency(_ string: String) { print("format \(string)") let formatter = NumberFormatter() formatter.numberStyle = .currency formatter.locale = findLocaleByCurrencyCode("NGN") let numberFromField = (NSString(string: currentString).doubleValue)/100 let temp = formatter.string(from: NSNumber(value: numberFromField)) self.amountTextField.text = String(describing: temp!.characters.dropFirst()) } func findLocaleByCurrencyCode(_ currencyCode: String) -> Locale? { let locales = Locale.availableIdentifiers var locale: Locale? for localeId in locales { locale = Locale(identifier: localeId) if let code = (locale! as NSLocale).object(forKey: NSLocale.Key.currencyCode) as? String { if code == currencyCode { return locale } } } return locale }
我制定了正常的货币格式(例如,1美元为1.00美元,88885美元为8,8885.00美元,7555.8569美元为7,555.86美元。
@IBAction func lostpropertyclicked(sender: AnyObject) { var currentString = "" currentString = amountTF.text formatCurrency(string: currentString) } func formatCurrency(#string: String) { println("format \(string)") let formatter = NSNumberFormatter() formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle formatter.locale = NSLocale(localeIdentifier: "en_US") var numberFromField = (NSString(string: currentString).doubleValue) currentString = formatter.stringFromNumber(numberFromField)! println(currentString ) }
- 为什么CFStringEncodings在Swift中没有UTF8?
- 无法使用types为“(NSMutableURLRequest,(_,_,_)throws – > _”)的参数列表调用“dataTaskWithRequest”
- 为什么这个随机函数代码在iPhone 5和5S上崩溃。
- 模拟器和iOS设备tableView Firebase
- Swift:沿着贝塞尔path渐变(使用CALayers)
- 分段控制,改变色调的不透明度,但不是边框
- 如何捕捉Swift崩溃并做一些日志logging
- XCode 8.3归档错误:链接器命令失败,退出代码1
- 检测Realm.io数据库是否需要迁移 – 如果是的话,将其销毁