处理模拟器和设备之间的小数分隔符更改

时间:2013-01-05 14:12:26

标签: ios number-formatting

我在我的应用程序中使用双打做一些数学运算。这在模拟器上很有效,模拟器使用句点来生成小数。当我在我的iPhone上运行时,我有一个逗号。当我使用逗号时它不会做任何事情。

我怎么能修改,所以这些东西要么把逗号视为句号,要么改变键盘(我使用小数点)所以我得到所有语言的句点输入?

2 个答案:

答案 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]);
        }
    }

}