zav*_*tra 11 objective-c ios swift
我正在尝试在用户输入时在Swift的文本字段中格式化货币输入.
到目前为止,我只能在用户完成输入时成功格式化:
@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)
}
Run Code Online (Sandbox Code Playgroud)
但是,我想在用户输入货币时格式化货币.当我尝试在TextField操作"编辑已更改"或"值已更改"时执行此操作时,我只能输入1个数字(如果我输入8,则变为$ 8.00)但是一旦我输入第二个数字,一切都会达到0.00美元而我除此之外不能进一步进入.
有什么建议?我觉得这应该是一个简单的修复,但我不能完全理解它.
Ste*_*erg 20
我今天早些时候修改了这个功能.适用于"en_US"和"fr_FR".但是,对于"ja_JP",除以100除以创建小数是一个问题.您需要有一个switch或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 )
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
这适用于我使用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
}
Run Code Online (Sandbox Code Playgroud)
基于@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 )
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22865 次 |
| 最近记录: |