1

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

我该如何修改,以便将逗号视为句点或更改键盘(我使用的是小数点),以便在所有语言中输入句点?

4

2 回答 2

5

正如@propstm 所说,不同的地区/语言环境使用不同的数字分隔符。 NSScanner是用于将文本转换为数字类型的标准框架类,并考虑了用户当前区域设置的所有约定。您应该将它用于从文本输入到双精度的转换。

但是,仅用句点替换逗号是不够的,因为例如,在美国语言环境中,1,234.56 美元是一种货币的有效值。如果您只是用句点替换逗号,这将变得无效。

使用 NSScanner。这是它专门设计的。

编辑

您也可以考虑将 anNSNumberFormatter与您的UITextField. 它可以真正帮助验证用户输入,甚至在您使用NSScanner. 检查出来

使用示例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。

于 2013-01-05T14:49:07.070 回答
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]);
        }
    }

}
于 2013-01-05T14:24:11.973 回答