Ios 文本格式文本字段swift
我正在尝试格式化文本字段。它应该包含数字,并且必须始终以“00”结尾。如果用户输入10,则文本应始终以10.00结尾。我试过了,但没有得到他想要的结果:Ios 文本格式文本字段swift,ios,swift,Ios,Swift,我正在尝试格式化文本字段。它应该包含数字,并且必须始终以“00”结尾。如果用户输入10,则文本应始终以10.00结尾。我试过了,但没有得到他想要的结果: func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let numberFormatter = NSNumberFormatt
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = .DecimalStyle
numberFormatter.minimumFractionDigits = 2
numberFormatter.maximumFractionDigits = 2
let textValue = Double(textField.text!)
textField.text = numberFormatter.stringFromNumber(textValue!)
return true
}
现在是空白了建议将文本转换为实际数字,并使用
NSNumberFormatter
设置最小分数位数
和最大分数位数
。例如:
let numberFormatter = NSNumberFormatter()
numberFormatter.locale = NSLocale.currentLocale()
numberFormatter.numberStyle = .DecimalStyle
numberFormatter.minimumFractionDigits = 2
numberFormatter.maximumFractionDigits = 2
textField.text = numberFormatter.stringFromNumber(#your number#)
建议将文本转换为实际数字,并使用
NSNumberFormatter
设置minimumFractionDigits
和maximumFractionDigits
。例如:
let numberFormatter = NSNumberFormatter()
numberFormatter.locale = NSLocale.currentLocale()
numberFormatter.numberStyle = .DecimalStyle
numberFormatter.minimumFractionDigits = 2
numberFormatter.maximumFractionDigits = 2
textField.text = numberFormatter.stringFromNumber(#your number#)
从您提供的代码开始,编译器给出了它崩溃的原因:“致命错误:在展开可选值时意外发现nil。”
textValue
是nil
,因为当引入第一个字符时,textField
是空的,从空字符串中获得一个双精度
的结果是nil
还要注意的是,即使一切正常,您也应该返回false
,以便在textField
中进行更改
关于解决方案,我不确定是否理解您的问题,因此我在这里提出两种解决方案:
S1:您希望更改文本字段,因此它总是以##.00格式显示一个数字,其中#是任意数字。
用户输入1并显示1.00。
注意,这样就不可能有这样的东西:10.50或2.35
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
var originalString = textField.text!
var replacedString: String!
// Deleting text
if string.isEmpty {
// Delete the first caracter before .00
let loc = originalString.characters.count - 4
let range = NSMakeRange(loc, 1)
replacedString = (originalString as NSString).stringByReplacingCharactersInRange(range, withString: "")
if replacedString == ".00" {
textField.text = ""
return false
}
replacedString = formatNumberFromString(replacedString)
textField.text = replacedString
return false
}
if originalString.isEmpty {
// If we want to avoid having zeros before the dot. Ex.: 000.00
if string == "0" {
return false
}
replacedString = string + ".00"
textField.text = replacedString
return false
} else {
// Original string has the format ###.00
originalString = originalString.stringByReplacingOccurrencesOfString(".00", withString: "")
replacedString = originalString + string + ".00"
// Format number
replacedString = formatNumberFromString(replacedString)
textField.text = replacedString
return false
}
// For any other UITextField's
return true
}
func formatNumberFromString(var stringNumber: String) -> String {
if stringNumber.isEmpty {
return ""
}
// Replace any formatting commas
stringNumber = stringNumber.stringByReplacingOccurrencesOfString(",", withString: "")
let doubleFromString = Double(stringNumber)
let finalString = numberFormatter.stringFromNumber(doubleFromString!)
return finalString!
}
S2:您想更改文本字段,因此它总是有两位小数。
如果用户输入1,则显示0.01。接下来是3,它显示0.13、7->1.37等等
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
var originalString = textField.text
// Replace any formatting commas
originalString = originalString!.stringByReplacingOccurrencesOfString(",", withString: "")
var doubleFromString: Double!
if originalString!.isEmpty {
originalString = string
doubleFromString = Double(originalString!)
doubleFromString! /= 100
} else {
if string.isEmpty {
// Replace the last character for 0
let loc = originalString!.characters.count - 1
let range = NSMakeRange(loc, 1)
let newString = (originalString! as NSString).stringByReplacingCharactersInRange(range, withString: "0")
doubleFromString = Double(newString)
doubleFromString! /= 10
} else {
originalString = originalString! + string
doubleFromString = Double(originalString!)
doubleFromString! *= 10
}
}
let finalString = numberFormatter.stringFromNumber(doubleFromString)
textField.text = finalString
return false
}
还请注意,我将NSNumberFormatter
初始值设定项移到这些函数之外,因为这是一个耗时的操作
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
let numberFormatter = NSNumberFormatter()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.textField.delegate = self
numberFormatter.numberStyle = .DecimalStyle
numberFormatter.minimumFractionDigits = 2
numberFormatter.maximumFractionDigits = 2
}
// ...
}
我希望这有助于解决您的问题。从您提供的代码开始,编译器给出了它崩溃的原因:“致命错误:在展开可选值时意外发现nil。”
textValue
是nil
,因为当引入第一个字符时,textField
是空的,从空字符串中获得一个双精度
的结果是nil
还要注意的是,即使一切正常,您也应该返回false
,以便在textField
中进行更改
关于解决方案,我不确定是否理解您的问题,因此我在这里提出两种解决方案:
S1:您希望更改文本字段,因此它总是以##.00格式显示一个数字,其中#是任意数字。
用户输入1并显示1.00。
注意,这样就不可能有这样的东西:10.50或2.35
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
var originalString = textField.text!
var replacedString: String!
// Deleting text
if string.isEmpty {
// Delete the first caracter before .00
let loc = originalString.characters.count - 4
let range = NSMakeRange(loc, 1)
replacedString = (originalString as NSString).stringByReplacingCharactersInRange(range, withString: "")
if replacedString == ".00" {
textField.text = ""
return false
}
replacedString = formatNumberFromString(replacedString)
textField.text = replacedString
return false
}
if originalString.isEmpty {
// If we want to avoid having zeros before the dot. Ex.: 000.00
if string == "0" {
return false
}
replacedString = string + ".00"
textField.text = replacedString
return false
} else {
// Original string has the format ###.00
originalString = originalString.stringByReplacingOccurrencesOfString(".00", withString: "")
replacedString = originalString + string + ".00"
// Format number
replacedString = formatNumberFromString(replacedString)
textField.text = replacedString
return false
}
// For any other UITextField's
return true
}
func formatNumberFromString(var stringNumber: String) -> String {
if stringNumber.isEmpty {
return ""
}
// Replace any formatting commas
stringNumber = stringNumber.stringByReplacingOccurrencesOfString(",", withString: "")
let doubleFromString = Double(stringNumber)
let finalString = numberFormatter.stringFromNumber(doubleFromString!)
return finalString!
}
S2:您想更改文本字段,因此它总是有两位小数。
如果用户输入1,则显示0.01。接下来是3,它显示0.13、7->1.37等等
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
var originalString = textField.text
// Replace any formatting commas
originalString = originalString!.stringByReplacingOccurrencesOfString(",", withString: "")
var doubleFromString: Double!
if originalString!.isEmpty {
originalString = string
doubleFromString = Double(originalString!)
doubleFromString! /= 100
} else {
if string.isEmpty {
// Replace the last character for 0
let loc = originalString!.characters.count - 1
let range = NSMakeRange(loc, 1)
let newString = (originalString! as NSString).stringByReplacingCharactersInRange(range, withString: "0")
doubleFromString = Double(newString)
doubleFromString! /= 10
} else {
originalString = originalString! + string
doubleFromString = Double(originalString!)
doubleFromString! *= 10
}
}
let finalString = numberFormatter.stringFromNumber(doubleFromString)
textField.text = finalString
return false
}
还请注意,我将NSNumberFormatter
初始值设定项移到这些函数之外,因为这是一个耗时的操作
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
let numberFormatter = NSNumberFormatter()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.textField.delegate = self
numberFormatter.numberStyle = .DecimalStyle
numberFormatter.minimumFractionDigits = 2
numberFormatter.maximumFractionDigits = 2
}
// ...
}
我希望这有助于解决您的问题。已经尝试过了,但在这种情况下并不正确。我使用shouldChangeCharactersInRange来格式化文本,但在这里它会中断让textValue=Double(textField.text!)textField.text=numberFormatter.stringFromNumber(textValue!)@brenomaris您可能应该编辑您的问题并显示您得到的结果(例如它是如何中断的)已经尝试过了,但在这种情况下不是正确的。我正在使用shouldChangeCharactersInRange格式化文本,但在这里它会中断让textValue=Double(textField.text!)textField.text=numberFormatter.stringFromNumber(textValue!)@brenomaris您可能应该编辑您的问题并显示您得到的结果(例如它是如何中断的)使用
numberFormatter.numberFromString
将文本转换为数字,而不是使用Double()
强制转换。还请提供崩溃时提供的错误。@spassas现在的文本为“nil”,请使用numberFormatter.numberFromString
将文本转换为数字,而不是Double()
强制转换。还请提供崩溃时提供的错误。@spassas现在在文本中为“nil”