Objective c 用户键入时格式化文本字段

Objective c 用户键入时格式化文本字段,objective-c,uitextfield,nsnumberformatter,uitextfielddelegate,Objective C,Uitextfield,Nsnumberformatter,Uitextfielddelegate,我希望用户在文本字段中键入一个金额,并希望该值在键入时进行格式化。这意味着当用户输入第四位数字时,一个逗号出现在适当的位置,表示千位数字。示例:3450 现在,我正在尝试使用textfield委托方法shouldChangeCharactersRange和NSNumberFormatter。不幸的是,我没有取得任何成功。有人能给我指出正确的方向吗?谢谢大家! 一个选项是在UITextField顶部覆盖一个带有透明背景的UILabel。注册为UITextField的代表并实施: -BOOLtext

我希望用户在文本字段中键入一个金额,并希望该值在键入时进行格式化。这意味着当用户输入第四位数字时,一个逗号出现在适当的位置,表示千位数字。示例:3450


现在,我正在尝试使用textfield委托方法shouldChangeCharactersRange和NSNumberFormatter。不幸的是,我没有取得任何成功。有人能给我指出正确的方向吗?谢谢大家!

一个选项是在UITextField顶部覆盖一个带有透明背景的UILabel。注册为UITextField的代表并实施:

-BOOLtextField:UITextField*textField应更改字符范围:nsrangerage替换字符串:NSString*string

然后,每次用户键入时,都会调用此方法,允许您获取新值,将其转换为整数并通过NSNumberFormatter传递,然后更新UILabel以显示此格式化值

static NSNumberFormatter *formatter;

- (BOOL)textField:(UITextField *)aTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{   
    NSString *textFieldValue = [aTextField.text stringByAppendingString:string];

    if (range.length > 0)
        textFieldValue = [aTextField.text substringToIndex:range.location];

    if ([textFieldValue isEqualToString:@""])
        self.formattedLabel.text = textFieldValue;
    else
    {
        NSDecimalNumber *newValue = [[NSDecimalNumber alloc] initWithString:textFieldValue];
        if (!formatter) formatter = [[NSNumberFormatter alloc] init];
        formatter.numberStyle = NSNumberFormatterDecimalStyle;
        self.formattedLabel.text = [formatter stringFromNumber:newValue];
    }

    return YES;
}

一个选项是在UIExtField顶部覆盖一个带有透明背景的UILabel。注册为UITextField的代表并实施:

-BOOLtextField:UITextField*textField应更改字符范围:nsrangerage替换字符串:NSString*string

然后,每次用户键入时,都会调用此方法,允许您获取新值,将其转换为整数并通过NSNumberFormatter传递,然后更新UILabel以显示此格式化值

static NSNumberFormatter *formatter;

- (BOOL)textField:(UITextField *)aTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{   
    NSString *textFieldValue = [aTextField.text stringByAppendingString:string];

    if (range.length > 0)
        textFieldValue = [aTextField.text substringToIndex:range.location];

    if ([textFieldValue isEqualToString:@""])
        self.formattedLabel.text = textFieldValue;
    else
    {
        NSDecimalNumber *newValue = [[NSDecimalNumber alloc] initWithString:textFieldValue];
        if (!formatter) formatter = [[NSNumberFormatter alloc] init];
        formatter.numberStyle = NSNumberFormatterDecimalStyle;
        self.formattedLabel.text = [formatter stringFromNumber:newValue];
    }

    return YES;
}

对不起。谢谢你让我知道。我不知道整个计分系统是如何运作的。哦,对不起。谢谢你让我知道。我不知道整个积分系统是如何工作的。谢谢你的提示!我试着用小数代替整数。它可以工作,但是标签落后一位。因此,如果我在文本字段中单击并输入3,标签将显示NaN。然后如果我输入4,它会显示$3.00,等等。。。我该如何解决这个问题?什么是NaN?除了使用不可见标签,您知道其他方法吗?谢谢。请尝试使用字符串参数而不是textField.text。我已经更新了我的示例。NaN的意思不是数字。嗯,我明白了。我的文本字段现在一次显示一个字符,每当我开始删除时,我都会得到NaN。现在我可以实际测试我编写的代码了,我已经开始工作了。再次更新我的示例。谢谢Mark,我感谢您的帮助。你能解释一下结尾的if语句吗,我不明白它背后的逻辑。谢谢你的提示!我试着用小数代替整数。它可以工作,但是标签落后一位。因此,如果我在文本字段中单击并输入3,标签将显示NaN。然后如果我输入4,它会显示$3.00,等等。。。我该如何解决这个问题?什么是NaN?除了使用不可见标签,您知道其他方法吗?谢谢。请尝试使用字符串参数而不是textField.text。我已经更新了我的示例。NaN的意思不是数字。嗯,我明白了。我的文本字段现在一次显示一个字符,每当我开始删除时,我都会得到NaN。现在我可以实际测试我编写的代码了,我已经开始工作了。再次更新我的示例。谢谢Mark,我感谢您的帮助。你能解释一下结尾的if语句吗,我不明白它背后的逻辑。