2

是否有现有的 Objective-C 库来处理对象计数、文件大小、日期、持续时间等的人类可读性?(并且基于 Cocoa 的 Foundation 框架?)

换句话说,给定一个 NSDate、NSNumber、NSTimeInterval 等或一个 NSArray 对象;是否有用于构造字符串表示的库来处理以下问题:

  • 计算单数与复数:显示“2 个文件”、“3 个文件”等,但显示“1 个文件”而不是“1 个文件”。
  • 日期:显示“昨天”而不是“2010-02-18”,“上周一”而不是“2010-02-15”等等。
  • 持续时间:显示“预计剩余时间:大约一个小时”而不是“...:57 分钟”。
  • 文件大小:50 字节显示“50 字节”,1073741824 字节显示“1.0 GiB”等等。

这似乎是一个图书馆必然已经存在的常见问题。甚至可能已经是 Apple 提供的标准框架(尽管我无法立即找到任何相关信息)。问题是在哪里?;)


注意:这确实是对dreamlax 答案的评论,但是作为评论发布太长了。

感谢您提供指向 MDC 文章的链接。我确实意识到这可能是一个相当复杂的问题。即使只考虑英语,更不用说多种语言了。

再说一次,这是一个如此复杂的问题,这更是我想要一个可以解决一些问题的库的原因。;)

文件大小确实看起来最简单,但即使这样也很容易出错。考虑以下代码输出作为对本网站上类似问题的回答。第一个代码奇怪地将 1023 字节报告为 1.0 KB。第二个报告 (1024 * 1024) - 1 个字节为 1024.00 KB,而第一个报告为 1.0 MB。根据 Calculator.app,(1024 * 1024) - 1 个字节约为 1.023,9990234375 KB。那么应该显示为“1023,99 KB”、“1024,00 KB”、“1.0 MB”、...?我不确定。

今天早些时候我很快写了一些代码来转换文件大小,然后在我为它编写单元测试时意识到它有类似的问题。

拥有一个已经考虑过这一点的图书馆真的很好......

1022 bytes              = 1022 bytes
1023 bytes              = 1.0 KB
1024 bytes              = 1.0 KB
1025 bytes              = 1.0 KB
(1024 * 1024) - 1 bytes = 1.0 MB
(1024 * 1024) bytes     = 1.0 MB
(1024 * 1024) + 1 bytes = 1.0 MB

[ 输出来自ObjC/Cocoa 类的代码,用于将大小转换为人类可读的字符串?]

1022 bytes              = 1022.00 B
1023 bytes              = 1023.00 B
1024 bytes              = 1024.00 B
1025 bytes              = 1.00 KB
(1024 * 1024) - 1 bytes = 1024.00 KB
(1024 * 1024) bytes     = 1024.00 KB
(1024 * 1024) + 1 bytes = 1.00 MB

[ 来自雪豹文件大小的代码输出]

产生上述输出的代码(相当明显,但仅供参考):

NSLog(@"1022 bytes              = %@", [self asFileSizeString: [NSNumber numberWithInt: 1022]]);
NSLog(@"1023 bytes              = %@", [self asFileSizeString: [NSNumber numberWithInt: 1023]]);
NSLog(@"1024 bytes              = %@", [self asFileSizeString: [NSNumber numberWithInt: 1024]]);
NSLog(@"1025 bytes              = %@", [self asFileSizeString: [NSNumber numberWithInt: 1025]]);
NSLog(@"(1024 * 1024) - 1 bytes = %@", [self asFileSizeString: [NSNumber numberWithInt: (1024 * 1024) - 1]]);
NSLog(@"(1024 * 1024) bytes     = %@", [self asFileSizeString: [NSNumber numberWithInt: (1024 * 1024)]]);
NSLog(@"(1024 * 1024) + 1 bytes = %@", [self asFileSizeString: [NSNumber numberWithInt: (1024 * 1024) + 1]]);
4

1 回答 1

2

关于多元化;这并不像人们想象的那么容易,尤其是在考虑其他语言时。MDC 有一篇关于这个问题的好文章

此外,在英语中,没有“前天”的意思,但在西班牙语中,可以使用“anteayer”这个词。当你只考虑英语时,这似乎很简单,但当你必须考虑许多不同的语言及其表示相对时间的方式时,它很快就会变得复杂。

最直接的是文件大小。这些可以用NSNumberFormatter. 数字格式化程序在确定如何表示数字时会考虑用户的语言环境。这更容易,因为单位在每种语言中的表示方式相同,数字也是如此。小数分隔符和/或千位分隔符由数字格式化程序处理。

于 2010-02-19T12:55:59.630 回答