【问题标题】:iOS Replace char in uitextfieldiOS替换uitextfield中的字符
【发布时间】:2013-02-01 12:34:40
【问题描述】:

我发现了一个烦人的问题。我有一个带有数字十进制键盘的文本字段,但模拟器有重点,设备有逗号(均为 6.1)。怎么办,如果你插入一个逗号,这被一个点代替?

谢谢

编辑:

这个过程,必须在这个方法中实时发生

- (BOOL) textField: (UITextField *) theTextField shouldChangeCharactersInRange: (NSRange) range ReplacementString: (NSString *) string

否则,逗号被写入,并在下一个字符处被替换

【问题讨论】:

  • 这是一个糟糕的用户体验。为了您的客户,请看我的回答。

标签: ios uitextfield


【解决方案1】:

你可以使用

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target 
                                        withString:(NSString *)replacement

例如:

NSString *str = myTextfield.text;

str = [str stringByReplacingOccurrencesOfString:@"."
                                     withString:@","];

自定义键盘见link

编辑 您可以检查在此函数中输入的字符串以及是否为@"。"然后你可以用@","来改变它

    // using something this


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
        [self updateTextLabelsWithText: newString];
        NSLog(@"Changed Str: %@",newString);

        return YES;
    }

    -(void)updateTextLabelsWithText:(NSString *)str
    {
     str = [str stringByReplacingOccurrencesOfString:@"."
                                             withString:@","];
         [myTextFiled setText:str];
    }

【讨论】:

  • 对不起,看问题的变化
  • @Vins 查看更新的答案。Also see.
  • 此代码不起作用。如果您手动更新文本字段的文本,则必须从 shouldChangeCharactersInRange 返回 NO。如果您希望框架继续并使用替换字符串更新文本字段,则仅返回 YES
【解决方案2】:

您对这个问题的看法不正确。当您使用十进制键盘设置文本字段时,键盘将根据用户的区域设置显示句点或逗号。这就是你想要的。一些用户希望输入十进制数字,例如3.14,而其他用户希望输入它们为3,14

运行“设置”应用并转到“通用”,然后转到“国际”。查看区域格式设置。这决定了用户的区域设置以及是否使用句点或逗号。您的设备和模拟器必须设置不同的区域格式设置。

这是最后一部分 - 一旦用户输入十进制值,您必须使用 NSNumberFormatter 将输入到文本字段中的字符串正确转换为 NSNumberNSNumberFormatter 将根据用户的区域设置正确处理数字中的逗号或句点。此外,当您需要向用户显示号码时,请使用NSNumberFormatter 将号码转换为字符串。这将确保数字以用户期望的格式显示给用户。

在用户输入值期间,请勿将逗号替换为句点。它会让用户感到困惑。

更新

您可以在shouldChangeCharactersInRange 委托方法中做的一件事就是确保输入的所有字符都是有效的数字字符。我不会做诸如检查两个小数分隔符之类的事情。只需让用户输入与数字相关的字符即可。

当用户试图离开文本字段时,您会进行最终验证。示例:

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

    NSNumber *val = [formatter numberFromString:textField.text];

    return val != nil; // don't let the user leave if text is not a valid number
}

【讨论】:

  • 好的,很好,但你能给我举个简单的例子吗?与我的例子有关吗?谢谢
  • 抱歉,举个例子?我是说你不需要对shouldChangeCharactersInRange 代表做任何事情。只需让用户在十进制小键盘上输入带有逗号或句点的数字即可。
  • 因为我确保放一个点。所以我在if ([textFieldString rangeOfString:@"."].location == NSNotFound) { //does not contain the dot return YES; } else { //contain the dot if ([string isEqualToString:@"."]) { return NO; } } 中有其他代码
  • 我一直说你不需要那个代码。你为什么要那个代码?
  • 当然你是对的,只是我不明白在哪里放置 NSNumberFormatter。例如,由于我没有标签,但是用户书写时在文本字段中表示数字,如果用户输入两个逗号,会发生什么情况?我应该把这个 NSNumberFormatter 放在哪里?谢谢,如果事情看起来微不足道,我很抱歉,但我从未使用过。
【解决方案3】:

斯威夫特 3.1

1) 将逗号(,)替换为点(.)

2) 只允许一个点(.)

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    let dotsCount = textField.text!.componentsSeparatedByString(".").count - 1
    if dotsCount > 0 && (string == "." || string == ",") {
        return false
    }

    if string == "," {
        textField.text! += "."
        return false
    }

    return true
}

【讨论】:

  • 但是如果字符被添加到字符串的中间呢?你不能总是把它加到最后。
猜你喜欢
  • 2013-04-08
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多