似乎无论我告诉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的文档中的相同。
显然有一些格式正在进行,因为(双)值被截断了一点,但不是我需要的。
除了“欢迎来到地狱的浮点运算”之外还有什么建议吗?
请赐教,这样我才能从幼儿时代毕业。
答案 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值...