我想在 ios Swift3 的 UITextField 中动态插入一个逗号
I want to dynamically insert a comma into UITextField for ios Swift3
尝试使用 NumberFormat 更改 UITextField 的字符失败。
数量:1000000.00
结果:
- 1.00
- 1,0.00
- 10,0.00
- 100,0.00
- 1,000,0.00
- 100,000,0.00
- 1,000,000,0.00
如何转换?
这是我失败的代码。
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if ((string == "0" || string == "") && (textField.text! as NSString).range(of: ".").location < range.location) {
return true
}
let cs = NSCharacterSet(charactersIn: "0123456789.").inverted
let filtered = string.components(separatedBy: cs)
let component = filtered.joined(separator: "")
let isNumeric = string == component
if isNumeric {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 0
let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
let numberWithOutCommas = newString.replacingOccurrences(of: ",", with: "")
let number = formatter.number(from: numberWithOutCommas)
if number != nil {
var formattedString = formatter.string(from: number!)
if string == "." && range.location == textField.text?.characters.count {
formattedString = formattedString?.appending(".")
}
/* // Fail...
if length! > 1 {
formattedString?.insert(",", at: (formattedString?.index((formattedString?.endIndex)!, offsetBy: -1))!)
}
*/
textField.text = formattedString
} else {
textField.text = nil
}
}
return false
}
对货币格式文本使用 Numberformatter
:
var formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterCurrencyStyle
formatter.locale = NSLocale.currentLocale()
print("\(formatter.stringFromNumber(number)!)")
let number = 1000000.00
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = NumberFormatter.Style.decimal
numberFormatter.string(from: NSNumber(value: number))
let str = numberFormatter.string(from: NSNumber(value: number))
print (str is ---%@",str)
output ---> 1,000,000
func textFieldDidEndEditing(textField: UITextField) {
var value = textField.text
var components = value.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "1234567890,.").invertedSet)
var decimalString = "".join(components) as NSString
let number = NSDecimalNumber(string: decimalString, locale:NSLocale.currentLocale())
var formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
formatter.locale = NSLocale.currentLocale()
if let formatedValue = formatter.stringFromNumber(number) {
textField.text = formatedValue
}
else {
textField.text = ""
}
}
我已经用下面的代码解决了。
if ((string == "0" || string == "") && (textField.text! as NSString).range(of: ".").location < range.location) {
return true
}
let cs = NSCharacterSet(charactersIn: "0123456789.").inverted
let filtered = string.components(separatedBy: cs)
let component = filtered.joined(separator: "")
let isNumeric = string == component
if isNumeric {
let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
let numberWithOutCommas = newString.replacingOccurrences(of: ",", with: "")
var charSum = 1;
var resultStr: String = ""
for (_, element) in numberWithOutCommas.characters.reversed().enumerated() {
resultStr.append(element)
if charSum % 3 == 1 {
resultStr.append(",")
}
charSum += 1
}
var str = String(resultStr.characters.reversed())
if str.characters.count > 0 {
if str[str.startIndex] == "," {
str.remove(at: str.startIndex)
}
}
textField.text = str
}
return false
尝试使用 NumberFormat 更改 UITextField 的字符失败。
数量:1000000.00
结果:
- 1.00
- 1,0.00
- 10,0.00
- 100,0.00
- 1,000,0.00
- 100,000,0.00
- 1,000,000,0.00
如何转换?
这是我失败的代码。
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if ((string == "0" || string == "") && (textField.text! as NSString).range(of: ".").location < range.location) {
return true
}
let cs = NSCharacterSet(charactersIn: "0123456789.").inverted
let filtered = string.components(separatedBy: cs)
let component = filtered.joined(separator: "")
let isNumeric = string == component
if isNumeric {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 0
let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
let numberWithOutCommas = newString.replacingOccurrences(of: ",", with: "")
let number = formatter.number(from: numberWithOutCommas)
if number != nil {
var formattedString = formatter.string(from: number!)
if string == "." && range.location == textField.text?.characters.count {
formattedString = formattedString?.appending(".")
}
/* // Fail...
if length! > 1 {
formattedString?.insert(",", at: (formattedString?.index((formattedString?.endIndex)!, offsetBy: -1))!)
}
*/
textField.text = formattedString
} else {
textField.text = nil
}
}
return false
}
对货币格式文本使用 Numberformatter
:
var formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterCurrencyStyle
formatter.locale = NSLocale.currentLocale()
print("\(formatter.stringFromNumber(number)!)")
let number = 1000000.00
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = NumberFormatter.Style.decimal
numberFormatter.string(from: NSNumber(value: number))
let str = numberFormatter.string(from: NSNumber(value: number))
print (str is ---%@",str)
output ---> 1,000,000
func textFieldDidEndEditing(textField: UITextField) {
var value = textField.text
var components = value.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "1234567890,.").invertedSet)
var decimalString = "".join(components) as NSString
let number = NSDecimalNumber(string: decimalString, locale:NSLocale.currentLocale())
var formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
formatter.locale = NSLocale.currentLocale()
if let formatedValue = formatter.stringFromNumber(number) {
textField.text = formatedValue
}
else {
textField.text = ""
}
}
我已经用下面的代码解决了。
if ((string == "0" || string == "") && (textField.text! as NSString).range(of: ".").location < range.location) {
return true
}
let cs = NSCharacterSet(charactersIn: "0123456789.").inverted
let filtered = string.components(separatedBy: cs)
let component = filtered.joined(separator: "")
let isNumeric = string == component
if isNumeric {
let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
let numberWithOutCommas = newString.replacingOccurrences(of: ",", with: "")
var charSum = 1;
var resultStr: String = ""
for (_, element) in numberWithOutCommas.characters.reversed().enumerated() {
resultStr.append(element)
if charSum % 3 == 1 {
resultStr.append(",")
}
charSum += 1
}
var str = String(resultStr.characters.reversed())
if str.characters.count > 0 {
if str[str.startIndex] == "," {
str.remove(at: str.startIndex)
}
}
textField.text = str
}
return false