今天我遇到了一个非常奇怪的问题。 我有这个静态方法(我刚刚创建的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:@“€”],但仍然是相同的输出!我无法弄清楚这里有什么问题,我被困住了。
我想到了源文件编码中的一个问题,所以我删除了它并重新创建它,但仍然是同样的问题....
如果任何人有最微小的线索,那将是最有帮助的。谢谢你们......
答案 0 :(得分:3)
问题是你正在尝试写一个int
(32位),但是你正在传递long long
(64位)并且正在读取longValue
的前4个字节对于value
的{{1}}和最后4个字节。恰好,_units
的低字节值为long long
并且不会导致崩溃。您需要使用nil
代替%lld
来正确打印长值。
%d