使用NSNumberFormatter的问题?

时间:2013-02-07 22:45:46

标签: xcode nsstring nsnumberformatter

我正在尝试制作一个标签来显示温度,温度超过100时最多有3位数,但我不想要任何小数...

    NSString *longtempstring = [tmp description];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setMaximumFractionDigits:3];
    [formatter setMinimumFractionDigits:0];
    NSString *shorttempstring = [formatter stringForObjectValue:[NSString  stringWithString:longtempstring]];

上面的代码总是返回(null)

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您收到nil,因为您传递给stringForObjectValue:的对象不属于预期类型。

首先,不要使用stringForObjectValue:。这是父类NSFormatter的成员。 NSNumberFormatter有更具体的方法可以避免混淆numberFromString:stringFromNumber:等对象类型。

其次,NSNumberFormatter用于从数字到格式化字符串或格式化字符串到数字。不直接从格式化字符串到格式化字符串。您需要使用一个数字格式化程序来读取原始字符串并生成一个数字,然后使用另一个数字格式化程序从该数字生成一个新的较短格式化字符串。

当然,您可以通过使用NSScanner或通过获取长字符串的子字符串(删除除数字本身之外的所有内容)和第一步(从长字符串到数字)更容易然后使用NSString方法integerValuedoubleValue。正则表达式也可用于从第一个(较长)字符串中提取数字。

它的长短不一,这是一个两步过程。第一步(获得一个数字)可以通过多种方式完成,NSNumberFormatter可能不是最简单的方法。第二步(获得一个新的更短的字符串)是NSNumberFormatter最适合的。

答案 1 :(得分:0)

我通过将NSString转换为NSNumber并仅从字符串中提取整数值来修复它,从而删除任何小数。

        NSString *longtempstring = [tmp description];
        NSNumber *tempintegervalue = [NSNumber numberWithInteger:[longtempstring integerValue]];
        NSString *shorttempstring = [tempintegervalue stringValue];

答案 2 :(得分:0)

NSString *longtempstring = [tmp description];

此处longtempstring的价值是多少?它甚至是一个数字吗?

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:3];
[formatter setMinimumFractionDigits:0];

如果您说您不想要任何小数位数,为什么将最大小数位数设置为3?分数位是“点后”,你说你不想要任何小数。如果您不想要任何小数,则必须将最小值和最大值设置为0

NSString *shorttempstring = [formatter stringForObjectValue:[NSString  stringWithString:longtempstring]];

首先,你为什么要复制字符串? [NSString stringWithString:...]创建一个新字符串,它是您作为参数提供的字符串的副本。字符串是不可变的,不需要复制它们,它们不会被修改。如果你害怕NSString实际上可能是NSMutableString,那么在NSString的子类之后你想要复制它,只需复制它通过致电[aString copy]。这里copy是一种非常聪明的方法。如果NSString实际上是一个可变字符串,它将真正复制它,因此您将获得一个不可变的副本。但是,如果它不是可变字符串,copy只返回保留计数增加1的相同字符串(因此在这种情况下copy的行为与retain完全相同)。但是,在您的情况下,复制毫无意义。

第二,是什么让你相信,你可以将字符串输入NSNumberFormater?它被称为NSNumberFormater,因为它格式化NSNumber类型的对象。 NSString一个NSNumber怎么样?它不叫NSStringFormater。如果您将错误类的对象提供给格式化程序,它将返回nil,这就是记录此方法的方法。

如果您的longtempstring包含带分数的数字,例如12.345,然后正确的代码如下所示:

NSString * longtempstring = [tmp description];
NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:0];
[formatter setMinimumFractionDigits:0];
NSNumber * tempnumber = [NSNumber numberWithDouble:[longtempstring doubleValue]];
NSString * shorttempstring = [formatter stringForObjectValue:tempnumber];

但是,如果你想做的就是切掉小数,这是一种可怕的方法。这可以更加有效:

double d;
NSString * longtempstring;
NSString * shorttempstring;

longtempstring = @"12.345";
d = [longtempstring doubleValue];
shorttempstring = [NSString stringWithFormat:@"%d", (int)d];

这个更短,需要更少的内存,并且至少快三倍。如果你想要对数字进行四舍五入(这意味着所有包含.5及以上分数的内容将四舍五入到下一个更高的值),只需将其舍入:

d = round([longtempstring doubleValue]);