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

4

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

NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
[f setMaximumFractionDigits:1];

_myNumber = [f numberFromString:myTextField.text];

有时这会导致_myNumber的值为nil,即使我在调试期间确定用户输入的是正确的十进制数。
为了完整起见: _myNumber是ViewController的一个自动生成属性。只有在设备上运行应用程序时才会出现这种情况,在模拟器中运行时不会出现。键盘使用的是“十进制键盘”。在另一个视图控制器的不同代码部分,该代码可以正常工作。
现在我有一个解决方法,我已经将其添加在上述代码下面:
if (!myNumber){
    myNumber = [NSNumber numberWithFloat: myTextField.text.floatValue];
}

有人知道为什么NSNumberFormatter可能返回nil吗?即使调用[NSNumber numberWithFloat: myTextField.text.floatValue]也能正常工作。


在模拟器和设备上,myTextField.text.floatValue 返回什么? - John Sauer
它返回正确的十进制数(浮点数),就像输入时一样。 - Brabbeldas
3个回答

7

在我的情况下,解决方案是将 NSNumberFormatter 的 "decimalSeparator" 设置为 ".",例如:

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

2

为什么模拟器可以正常运行,而设备却不能,这取决于语言设置。我的模拟器设置为英语,而我的设备设置为荷兰语。在英语中,“.”被用作小数分隔符,而在荷兰语中,“,”被用作小数分隔符。

在将原始值写入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];

0

我遇到了同样的问题,但不是在文本输入方面,而是在使用小数点"."作为分隔符的API中。在我的设备上使用DecimalNumberFormatter失败(德国使用“,”),但是在模拟器上没有问题(可能使用了美国地区设置)。

我的解决方法是确定小数分隔符并将其提供给格式化对象:

    f.decimalSeparator = "."

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接