我在我的应用程序中使用双打做一些数学运算。这在模拟器上很有效,模拟器使用句点来生成小数。当我在我的iPhone上运行时,我有一个逗号。当我使用逗号时它不会做任何事情。
我怎么能修改,所以这些东西要么把逗号视为句号,要么改变键盘(我使用小数点)所以我得到所有语言的句点输入?
答案 0 :(得分:5)
正如@propstm所说,不同的地区/语言环境使用不同的数字分隔符。 NSScanner是用于将文本转换为数字类型的标准框架类,并考虑了用户当前区域设置的所有约定。您应该将它用于从文本输入到双精度的转换。
但是,简单地用逗号替换逗号是不够的,因为例如,在美国区域设置$ 1,234.56是货币的有效值。如果您只是用句点替换逗号,则会变为无效。
使用NSScanner。这就是它专门为它设计的。
修改强>
您也可以考虑在NSNumberFormatter
上使用UITextField
。在使用NSScanner
进行扫描之前,它可以真正帮助验证用户输入。 Check it out
使用NSNumberFormatter
的示例:
将viewController设置为UITextField的委托,并添加此方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *proposedNewValue = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
return (nil != [numberFormatter numberFromString:resultString]);
}
这将使字段不接受格式不正确的数字。您也可以使用此方法从文本中获取NSNumber
。
要使用NSScanner
,您可以执行以下操作:
- (IBAction)doStuff:(id)sender
{
NSString* entry = textField.text;
double value = 0;
if ([[NSScanner scannerWithString:entry] scanDouble: &value])
{
// If we get here, the scanning was successful
}
else
{
// Scanning failed -- couldn't parse the number... handle the error
}
}
HTH。
答案 1 :(得分:2)
根据语言设置,有时您会看到逗号有时是句号。
为了数学,请接受用户输入,然后对值进行验证,以确保它们使用正确的方程式格式。可能会保存逗号或句点的首选项,然后重新格式化输出,以便用户熟悉格式。
- (void)validateUserInputs{
for(UIControl *control in self.view.subviews){
if([control isMemberOfClass:[UITextField class]]){
NSString *convertedText = [[(UITextField *)control text] stringByReplacingOccurrencesOfString:@"," withString:@"."];
[(UITextField *)control setText:convertedText];
}
}
for(UIControl *control in self.view.subviews){
if([control isMemberOfClass:[UITextField class]]){
NSLog(@"Converted String Value: %@", [(UITextField *)control text]);
}
}
}