当编辑UITextField时,我如何实时格式化文本?

13

我如何在输入时更改 UITextField 的文本值?

换句话说:

当我输入 1 时,应该显示 1

当我输入 10 时,应该显示 10

当我输入 100 时,应该显示 100, 但是

当我输入 1000 时,应该显示 1,000

你能提供任何想法吗?


如果我在UITextField 1中写入数字1, 如果我在UITextField 10中写入数字10, 如果我在UITextField 1,000中写入数字1000等。 在输入小数时,通过该格式更改结果。 - user2789934
2
你在输入1000的时候想要插入逗号,是吗? - Agent Chocks.
使用 UITextField Delegate 方法。 - Toseef Khilji
6个回答

18

向文本字段控件添加一个"textFieldDidChange"通知方法。

[textField addTarget:self
              action:@selector(textFieldDidChange:)
    forControlEvents:UIControlEventEditingChanged];


-(void)textFieldDidChange:(UITextField *)theTextField
{
    NSLog(@"text changed: %@", theTextField.text);

    NSString *textFieldText = [theTextField.text stringByReplacingOccurrencesOfString:@"," withString:@""];

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    NSString *formattedOutput = [formatter stringFromNumber:[NSNumber numberWithInt:[textFieldText integerValue]]];
    textField.text=formattedOutput;            
}

它目前运作良好,但仅适用于长度为4的数字。 - user2789934
如果我写1000,这个程序可以正常工作, 但如果我写10000,它会清除逗号后面的数字。 - user2789934
在iOS 7和Xcode 5中:如果我输入1000,这个工作得很好,但如果我输入10000,它会清除后面的数字。 - user2789934
@KK。你的代码工作得很好,但是有一个问题,如果用户输入了句点,它只会将其删除。 - Shabir jan

4
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init] ;
    if([string length]==0)
    {
        [formatter setGroupingSeparator:@","];
        [formatter setGroupingSize:4];
        [formatter setUsesGroupingSeparator:YES];
        [formatter setSecondaryGroupingSize:3];
        NSString *num = textField.text ;
        num = [num stringByReplacingOccurrencesOfString:@"," withString:@""];
        NSString *str = [formatter stringFromNumber:[NSNumber numberWithDouble:[num doubleValue]]];
        textField.text = str;
        return YES;
    }
    else {
        [formatter setGroupingSeparator:@","];
        [formatter setGroupingSize:2];
        [formatter setUsesGroupingSeparator:YES];
        [formatter setSecondaryGroupingSize:3];
        NSString *num = textField.text ;
        if(![num isEqualToString:@""])
        {
            num = [num stringByReplacingOccurrencesOfString:@"," withString:@""];
            NSString *str = [formatter stringFromNumber:[NSNumber numberWithDouble:[num doubleValue]]];
            textField.text = str;
            NSLog(@"add:%@",str);
        }
        return YES;
    }
}

顺便提一下,这段代码是在ARC下编写的,请注意在非 ARC 环境下进行内存管理。


1

Swift:

请确保选择文本字段输入为数字键盘,然后:

在您的viewDidLoad中:

yourTextField(self, action: #selector(self.textFieldDidChange(textField:)), for: .editingChanged)

然后,在同一个视图控制器中:
func textFieldDidChange(textField: UITextField) {
        if textField == yourTextField {

            // Some locales use different punctuations.
            var textFormatted = textField.text?.replacingOccurrences(of: ",", with: "")
            textFormatted = textFormatted?.replacingOccurrences(of: ".", with: "")

            let numberFormatter = NumberFormatter()
            numberFormatter.numberStyle = .decimal
            if let text = textFormatted, let textAsInt = Int(text) {
                textField.text = numberFormatter.string(from: NSNumber(value: textAsInt))
            }
        }
    }

1
添加动作:
self.amountTextField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)

在操作中:
@objc func textFieldDidChange(textField: UITextField) {
    if textField == amountTextField {
        
        var textFormatted = textField.text?.replacingOccurrences(of: ".", with: "")
        textFormatted = textFormatted?.replacingOccurrences(of: ".", with: "")

        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        if let text = textFormatted, let intVal = Int(text) {
            textField.text = formatter.string(from: NSNumber(value: intVal))
        }
    }
}

-1
确保 `textField.keyboardType = .numberPad`
实现 UITextFieldDelegate 方法:
```swift func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
let modifiedText = (text as NSString).replacingCharacters(in: range, with: string)
let formatter = NumberFormatter() formatter.usesGroupingSeparator = true formatter.numberStyle = .decimal formatter.groupingSeparator = ","
let modifiedTextWithoutGroupingSeparator = modifiedText.replacingOccurrences(of: formatter.groupingSeparator, with: "")
if let formattedNumber = formatter.number(from: modifiedTextWithoutGroupingSeparator) { textField.text = formatter.string(from: formattedNumber) }
return false } ```

-3

试试这个.. 你可以在 ViewDidLoad 方法中写下以下代码行,并将委托给文本框。

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

并编写以下方法。

-(void)textFieldDidChange:(UITextField*)textfield{
  NSLog(@"here %@",textfield.text);
  if ([textfield.text isEqualToString:@"1000"]) {
    textfield.text=@"1,000";
  }
}

我有两个问题。1. 如果我写1000或100000或在1后面加上3个以上的零,它仍然显示为1,000或1,0000。第二个问题是:在viewDidLoad中添加选择器是否必要?如果我将文本字段声明为局部变量会发生什么? - kumar123
是的,它将保持不变。我只是将其设置为静态以了解想法。是的,我们需要添加选择器。这是必要的。我们没有作为委托的textFieldDidChange:,所以我们需要添加选择器。 - kalyani puvvada
抱歉,你没有理解我的意思。你在viewDidLoad中添加选择器并不是必要的。如果你将其声明为局部变量,则将选择器放置在那里,否则可以放在实例变量的任何地方。已知问题是静态答案,如果用户意外输入了3个零并删除了一个,仍然会有逗号。我认为这不是一个答案,因为以上代码引发了很多情况。 - kumar123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接