在 UITextField 中添加逗号作为用户类型的数值

Posted

技术标签:

【中文标题】在 UITextField 中添加逗号作为用户类型的数值【英文标题】:Adding commas to number values as user types in the UITextField 【发布时间】:2016-12-16 06:22:31 【问题描述】:

我对@9​​87654321@ 使用了一种更改方法,我想在用户输入数字时格式化UITextField。就像我希望数字被实时格式化一样。我希望将 1000 更改为 1,000、50000 更改为 50,000 等等。

我的问题是我的UITextField 值没有按预期更新。例如,当我在UITextField 中输入 50000 时,结果返回为 5,0000 而不是 50,000。这是我的代码:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 

    //check if any numbers in the textField exist before editing
    guard let textFieldHasText = (textField.text), !textFieldHasText.isEmpty else 
        //early escape if nil
        return true
    

    let formatter = NumberFormatter()
    formatter.numberStyle = NumberFormatter.Style.decimal

    //remove any existing commas
    let textRemovedCommma = textFieldHasText.replacingOccurrences(of: ",", with: "")

    //update the textField with commas
    let formattedNum = formatter.string(from: NSNumber(value: Int(textRemovedCommma)!))
    textField.text = formattedNum
    return true

【问题讨论】:

***.com/questions/24115141/… 【参考方案1】:

shouldChangeCharactersIn 的第 1 条规则 - 如果将值分配给文本字段的 text 属性,则必须返回 false。返回true 告诉文本字段对您已经修改的文本进行原始更改。这不是你想要的。

您的代码中还有另一个重大缺陷。它不适用于使用其他方式格式化更大数字的语言环境。并非所有语言环境都使用逗号作为组分隔符。

【讨论】:

谢谢 - 我没有意识到我错误地使用了真/假返回。并感谢您发现语言环境问题。我会尝试解决这个问题,我会报告!【参考方案2】:

尝试使用 NSNumberFormatter

var currencyFormatter = NumberFormatter()
currencyFormatter.usesGroupingSeparator = true
currencyFormatter.numberStyle = .currency
// localize to your grouping and decimal separator
currencyFormatter.locale = NSLocale.current
var priceString = currencyFormatter.string(from: 9999.99)

它会打印出类似 = "$9,999.99"

的值

您也可以根据需要设置Locale

【讨论】:

【参考方案3】:
let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.decimal
let textRemovedCommma = textField.text?.replacingOccurrences(of: ",", with: "")
let formattedNum = formatter.string(from: NSNumber(value: Int(textRemovedCommma!)!))
textField.text = formattedNum

【讨论】:

你好!虽然此代码 sn-p 可能是解决方案,但including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。【参考方案4】:

不要使用小数样式,而是使用货币样式。如果不需要,也设置currencySymbol 空字符串。还要确保您的设备区域选择为印度,否则它将在 3 位而不是 2 位后添加逗号。

 -(NSString*)addingCommasToFloatValueString:(NSString *)rupeeValue 

NSNumber *aNumber = [NSNumber numberWithDouble:[rupeeValue   doubleValue]];
NSNumberFormatter *aFormatter = [NSNumberFormatter new];
[aFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[aFormatter setCurrencySymbol:@""];
[aFormatter setMinimumFractionDigits:0];
[aFormatter setMaximumFractionDigits:2];
NSString *formattedNumber = [aFormatter stringFromNumber:aNumber];
return formattedNumber;

【讨论】:

以上是关于在 UITextField 中添加逗号作为用户类型的数值的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中使用 UITextField 条目作为数组

添加 UITextField 作为 UITableViewCell 的子视图在 IOS 6 中工作正常,但在 IOS 7 中它不起作用?

将占位符添加到 UITextField,如何以编程方式快速设置占位符文本?

在顶部添加UILabel作为UITextField的子视图

UIPickerView 和 UITextField 从 UIPickerView 获取值

快速为 uiTextField 添加前缀