当用户在 UITextField 中键入时,将逗号添加到数字值

Adding commas to number values as user types in the UITextField

我正在使用一种更改为 this 的方法,我想在用户输入数字时格式化 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
}

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

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

尝试使用 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

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

不要使用小数样式,而是使用货币样式。如果不需要,还可以将 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;
}