如何从UITextField获取带有NSLocale智能的NSNumber?

时间:2014-02-24 11:22:03

标签: ios objective-c localization

轻松获取要显示的数字的正确本地化格式。 但是提示从UITextField输入十进制数字是非常棘手的。

即使小数键盘可能会显示欧洲使用的逗号而不是停止,但处理输入的方法显然仍需要精通语言环境。

我在S.O.的研究。和其他地方建议

-(IBAction)buttonPress:(UIButton *)sender
{
NSNumber *firstNumber  = @([self.firstField.text floatValue]); // 2 alternative ways
NSNumber *secondNumber = [NSNumber numberWithFloat:[self.secondField.text floatValue]];    
.
.

只给我整数来执行算术运算。它们根本不是浮子。它们没有浮动值

假设这是应用程序唯一做的事情,我马上做:

.
.
NSNumberFormatter *numberFormat = [[ NSNumberFormatter alloc] init];
[ numberFormat setNumberStyle:NSNumberFormatterDecimalStyle];
[ numberFormat setLocale:[NSLocale currentLocale]];
[ numberFormat setMaximumFractionDigits:2];

NSString *displayString = [ numberFormat stringFromNumber:firstNumber];
self.resultLabel.text = displayString;
}

我将输入返回到ViewController中的标签而不进行任何进一步处理,以确保没有格式化程序不会隐藏小数。没有喜悦。仍然是整数。

显然应用程序必须以计算方式执行某些操作,并且因为无法直接处理NSNumber包装器,所以我必须在执行转换之前解决它:

double xD = [firstNumber  doubleValue];
double yD = [secondNumber doubleValue];

问题是,输入的小数位在哪里丢失? 我对桌面键盘和模拟器没有任何问题,但是如果我将测试设备设置为 - 比如 - 波兰语那么根本就不会这样做。

编辑: 这是下面提供的答案的结果

// run these 4 methods first, that way you can re-use *numberFormat for the display
NSNumberFormatter *numberFormat = [[ NSNumberFormatter alloc] init];
[ numberFormat setNumberStyle:NSNumberFormatterDecimalStyle];
[ numberFormat setLocale:[NSLocale currentLocale]];
[ numberFormat setMaximumFractionDigits:2];

// here 'tis
NSNumber *firstNumber = [numberFormat numberFromString:self.firstField.text];
// do the same for other input UITextFields
// sh-boom. there you go

1 个答案:

答案 0 :(得分:1)

您需要使用longLongValue而不是longValue将 NSString 转换为long类型。或使用 NSNumberFormatter - > numberFromString: