NSNumberFormatter表现得像我两岁

时间:2014-08-29 04:12:50

标签: objective-c

似乎无论我告诉NSNumberFormatter有多少不同的东西,它似乎都不理我。请帮助我为这个孩子找到合适的词语!

经过SO研究,Apple文档和尝试我仍然失败。

我的问题是:如何截断NSString以产生所需的位数和舍入行为?

我从XML API中提取数据。存储在我需要格式化的NSString中的数字如下所示:

29.958662

总会有两个整数位和六位十进制数。我要求格式化的数字看起来像这样:

29.92

正好有两个整数和两个十进制数字。在填充零的情况下,格式化的数字应如下所示:

30.00

相关代码的第一行是存储未格式化数字的位置 - 检查altimeterTextString会产生@“29.958662”

NSString *altimeterTextString = [TBXML textForElement:altimeter];

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setRoundingMode:NSNumberFormatterRoundHalfUp];
[numberFormatter setMinimumFractionDigits:2];
[numberFormatter setMaximumFractionDigits:2];

NSNumber *altimeterValue = [numberFormatter numberFromString:altimeterTextString];

检查altimeterValue产量:(双倍)29.9587

我尝试了更多的setPositiveFormat迭代:@“00。##”,setMinimumFractionDigits,setMaximumFractionDigits,以及所有其他似乎适用于SO的其他解决方案,以及NSNumberFormatter的文档中的相同。

显然有一些格式正在进行,因为(双)值被截断了一点,但不是我需要的。

除了“欢迎来到地狱的浮点运算”之外还有什么建议吗?

请赐教,这样我才能从幼儿时代毕业。

3 个答案:

答案 0 :(得分:3)

您也可以这样做:

NSString *altimeterTextString = @"29.958662";
NSString* fStr = [NSString stringWithFormat:@"%.02f", [altimeterTextString doubleValue]];
NSNumber *altimeterValue = @([fStr doubleValue]);

现在,如果您要么或是打印altimeterValue,它总是有正确的值!

答案 1 :(得分:2)

我认为你实际上并没有做错任何事。我认为你对被检查的值以及NSNumberFormatter的用途感到困惑。

尝试在您发布的代码后添加此内容:

NSNumber *altimeterValue = [numberFormatter numberFromString:altimeterTextString];
NSLog(@"%@",[numberFormatter stringFromNumber:altimeterValue]);

我得到的输出是:

  

29.96

正在发生的事情是它成功地将您的字符串转换为数字(双精度数),然后使用NSNumberFormatter以您想要的任何精度呈现给您的用户。

NSNumberFormatter特别用于将数字呈现为文本,并且它可以很好地完成它。实际转换虽然比NSString上的数字转换方法更强大,比如intValue等,但它的种类并没有差别。

对于记录,您还可以使用以下代码行将字符串转换为相同的完整双精度:

    NSNumber *altimeterValue = @([altimeterTextString doubleValue]);

此外,虽然我只是在乱搞,如果你真的想要在文本中精确修剪价值,你可以这样做:

NSNumber *trimmedNumber = [numberFormatter numberFromString:[numberFormatter stringFromNumber:altimeterValue]];

在这种情况下,如果您记录trimmedNumber的valud

    NSLog(@"%f", [trimmedNumber doubleValue]);

你得到:29.960000

可能有更好的方法可以解决这个问题,但需要紧张......

答案 2 :(得分:0)

这是Swift中的一个版本,将它转换为ObjC应该不是问题:

let num = "29.958662"

let formatter = NSNumberFormatter()
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2
formatter.minimumIntegerDigits = 2
formatter.maximumIntegerDigits = 2

let formattedNumber = formatter.stringFromNumber((num as NSString).doubleValue)

println(formattedNumber)

基本上,我创建格式,然后我使用stringFromNumber,我传递从原始字符串创建的double值...