现在我正在制作一个应用程序,用户需要在 UITextField 中输入货币值、小数点可选。当我尝试在给定的小数点后防止超过 2 个数字同时防止超过一个小数点时,我的问题就出现了。我在网上进行了研究,但找不到确切的答案。我发现我很可能需要使用 shouldChangeCharactersInRange,但我不确定如何准确使用它......
谢谢,维林德博拉
现在我正在制作一个应用程序,用户需要在 UITextField 中输入货币值、小数点可选。当我尝试在给定的小数点后防止超过 2 个数字同时防止超过一个小数点时,我的问题就出现了。我在网上进行了研究,但找不到确切的答案。我发现我很可能需要使用 shouldChangeCharactersInRange,但我不确定如何准确使用它......
谢谢,维林德博拉
您将使用数字格式化程序:
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPositiveFormat:@"###0.##"];
NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.4563];
NSLog(@"formattedNumberString: %@", formattedNumberString);
// Output for locale en_US: "formattedNumberString: formattedNumberString: 122,344.45"
你可以把它放在你的 UITextFieldDelegate 方法之一中,比如textField:shouldChangeCharactersInRange:replacementString:
. 通过执行以下操作获取最新的字符串:NSString *s = [textField.text stringByReplacingCharactersInRange:range withString:string];
然后您将使用 获取该字符串的数字值,@([s floatValue])
然后使用如上所示的数字格式化程序,然后将其放入文本字段中。
在弄乱他们的输入之前,我会做一些检查以确保他们在小数点后至少输入了两位数。但这将是正确的本地化方式。
// add a notification & use following function:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textIsChanged:) name:UITextFieldTextDidChangeNotification object:nil];
-(void)textIsChanged:(NSNotification*)notification
{
NSString * currentText = yourTextField.text;
if ([currentText rangeOfString:@"."].location != NSNotFound)
{
NSArray *arr = [currentText componentsSeparatedByString:@"."];
if(arr.count == 2)
{
NSString *afterDecimalPart = [arr objectAtIndex:1];
if(afterDecimalPart.length > 2)
{
currentText = [currentText substringToIndex:currentText.length-1];
yourTextField.text = currentText;
}
}
}
}