NSNumberFormatter在设备上返回nil,而不是在模拟器上

我使用NSNumberFormatter将用户input转换为NSNumber(十进制数),我使用ARC。

NSNumberFormatter *f = [[NSNumberFormatter alloc] init]; [f setNumberStyle:NSNumberFormatterDecimalStyle]; [f setMaximumFractionDigits:1]; _myNumber = [f numberFromString:myTextField.text]; 

有时这会导致_myNumber nil 。 即使当我绝对确定用户input是一个正确的十进制数(我在debugging过程中检查)。

为了完整性, _myNumber是ViewController的综合属性。 这只发生在设备上运行的应用程序,而不是当我在模拟器中运行。 正在使用的键盘是“Decimal Pad”在代码的不同部分,在不同的ViewController中,代码确实起作用。

我现在有一个解决方法,我已经在上面的代码添加下面:

 if (!myNumber){ myNumber = [NSNumber numberWithFloat: myTextField.text.floatValue]; } 

有人知道为什么NSNumberFormatter可以返回零,即使调用[NSNumber numberWithFloat: myTextField.text.floatValue]作品?

在我的情况下,解决scheme将NSNumberFormatter的“decimalSeparator”设置为“。”,例如:

 NSNumberFormatter *formatString = [[NSNumberFormatter alloc] init]; formatString.decimalSeparator = @"."; 

为什么这是在模拟器上,而不是在设备上,取决于语言设置。 我的模拟器设置为英语,而我的设备设置为荷兰语。 在英文中使用“。”作为小数点分隔符,使用荷兰语时,使用“,”。

将原始值写入UITextField时,我使用了以下代码:

 _myTextField.text = [NSString stringWithFormat:@”%.1f”, [_myNumber floatValue]]; 

这将导致始终将“。”作为小数点分隔符,根据语言设置的不同,该格式可能正确也可能不正确。 我所要做的就是使用NSNumberFormatter将值设置到UITextField中:

 NSNumberFormatter *f = [[NSNumberFormatter alloc] init]; [f setNumberStyle:NSNumberFormatterDecimalStyle]; [f setMaximumFractionDigits:1]; _myTextField.text = [f stringFromNumber:_myNumber]; 

我有同样的问题,但没有与文本input,但消费的小数点分隔符是“。”。 在我的设备上使用DecimalNumberFormatter失败(德国使用“,”),但不在模拟器上(可能使用美国地区设置)。

我的修复是确定小数点分隔符并将其提供给格式化程序对象:

  f.decimalSeparator = "."