使用formatString的奇怪的NSString行为

时间:2011-12-13 14:06:10

标签: objective-c nsstring

今天我遇到了一个非常奇怪的问题。 我有这个静态方法(我刚刚创建的CommonUtilities源文件的一部分,它收集了我想在我的代码中的任何地方访问的所有小常用方法,就像我通常做的那样......)

我只想用国际系统符号(k,M,G等)将数字转换为科学价值

以下是代码:

+ (NSString*)scientificFormatedStringForValue:(NSNumber*)value andUnits:(NSString*)_units
{
    NSMutableString* retStr = [NSMutableString string];
    long long longValue = [value longLongValue];
    if (longValue > 1000000000)
    {
        [retStr appendFormat:@"%d Md%@", longValue / 1000000000, _units];
    }
    else if (longValue > 1000000)
    {
        [retStr appendFormat:@"%d M%@", longValue / 1000000, _units];
    }
    else if (longValue > 1000)
    {
        [retStr appendFormat:@"%d k%@", longValue / 1000, _units];
    }
    else
    {
        [retStr appendFormat:@"%d %@", longValue, _units];
    }
    return retStr;
}

这很简单吧? 好的,这是交易:_units未正确转换。

在我的例子中,我使用了这个:

[CommonUtilities scientificFormatedStringForValue:[NSNumber numberWithLongLong:longValue] andUnits:@"€"];

我为(null)获取格式化字符串的_units。如果我打印_units的值,它就是一个点。所以,为了尝试调试这个,我只是替换了:

[retStr appendFormat:@"%d M%@", longValue / 1000000, _units];

[retStr appendFormat:@"%d M%@", longValue / 1000000, @"€"];

仍然无效。它尝试传递一个字符(认为可能必须将€转换为某些UTF8或其他什么。所以我将调用方法更改为:

[CommonUtilities scientificFormatedStringForValue:[NSNumber numberWithLongLong:longValue] andUnits:@"e"];

仍然很糟糕的东西。我甚至将@“€”更改为[NSString stringWithString:@“€”],但仍然是相同的输出!我无法弄清楚这里有什么问题,我被困住了。

我想到了源文件编码中的一个问题,所以我删除了它并重新创建它,但仍然是同样的问题....

如果任何人有最微小的线索,那将是最有帮助的。谢谢你们......

1 个答案:

答案 0 :(得分:3)

问题是你正在尝试写一个int(32位),但是你正在传递long long(64位)并且正在读取longValue的前4个字节对于value的{​​{1}}和最后4个字节。恰好,_units的低字节值为long long并且不会导致崩溃。您需要使用nil代替%lld来正确打印长值。

%d