【问题标题】:Weird NSString behavior with formatString奇怪的 NSString 行为与 formatString
【发布时间】:2011-12-13 14:06:10
【问题描述】:

我今天遇到了一个很奇怪的问题。 我有这个静态方法(我刚刚创建的 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:@"€"],但仍然是相同的输出!我无法弄清楚这里出了什么问题,我被卡住了。

我想到源文件的编码有问题,所以我把它删了重新创建,但还是同样的问题......

如果有人有最细微的线索,那将是最有帮助的。谢谢各位...

【问题讨论】:

  • 你有 [retStr appendFormat:@"%d Md%@", longValue / 1000000000, _units],你不是说 appendFormat:@"%d Gd%@" 吗?千兆不是超级?
  • 您是否尝试过在方法中创建NSString,只是为了确定?
  • @Gnat 这看起来像法语的十亿(Milliard)。
  • @Radada:如果你没有在你的方法中做任何其他事情,你真的不需要NSMutableString,你可以直接创建并返回你的字符串。
  • 我无法用普通的@"e" 重现该问题

标签: objective-c nsstring


【解决方案1】:

问题是您正在尝试编写 int(32 位),但您传递的是 long long(64 位),它正在读取 longValue 的前 4 个字节以获取 value_units 的最后 4 个字节。碰巧你的long long 的低字节值是nil 并且没有导致崩溃。您需要使用%lld 而不是%d 才能正确打印长值。

    longValue       NSString*
/---------------\ /---------\
|   8 bytes     | | 4 bytes |
\---------------/ \---------/
^^^^^^^^ ^^^^^^^^  ^^^^^^^^^
   %d       %@        This gets ignored.
(reads 4) (reads this 4 bytes which happen to be nil)

【讨论】:

  • 哇,谢谢这个完整的答案:))我现在明白了一点。谢谢乔^^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2021-10-30
  • 2022-01-20
相关资源
最近更新 更多