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 = "."