4
  1. 我想通过使用“K”代表千,“M”代表百万等等来缩短货币数字。

  2. 由于数字代表货币价值,我还NSNumberFormatter根据其价值、货币和设备的区域设置来正确格式化每个数字。

我已经能够分别做 1 和 2,但是很难同时做这两个。起初,我尝试简单地将缩写附加到格式正确的输出字符串NSNumberFormatter(例如,将“K”附加到“$10.3”以获得“$10.3K”)。

这适用于大多数货币,直到我遇到在数字值之后显示货币符号的区域格式(例如,“+10.3 $US”将变为“+10.3 $USK”而不是“+10.3K $US”)。

我不确定是否有一种简单的方法可以确定货币符号是在给定货币和区域设置的数值之前还是之后。关于解决此问题的任何建议?

提前致谢。

4

2 回答 2

4

有趣的问题!iOS 库不支持这一点(而且我也从未见过其他平台上的语言环境定义支持这种格式),因此您只能坚持自己的实现。

使用字母 K 和 M 本身的约定在其他语言环境中可能不起作用。例如,M 会让法语使用者感到困惑,因为“mille”、“million”和“milliard”(法语中表示千、百万和十亿的意思)都以字母 M 开头,而我只见过法语中常用的K带有金额(我是母语人士),在某些领域(例如地理)中使用小写m和大写M分别表示百万和十亿。

也许您应该权衡这是否是所有地区都必须具备的,或者是否有其他方式来展示您的信息。您总是可以在您知道它有效的语言环境(例如 en_US)中使用缩写的实现,并为其他语言环境使用非缩写数字。

另一个建议是基于活动语言而不使用 iOS 区域格式(即通过您的格式字符串自行决定货币、数字和字母 K 的位置)localizable.strings文件,以便翻译人员可以在必要时以您的每种语言更改它)。您仍然会获得依赖于语言环境的小数点,但其他一切都将由您的本地化决定。这不是一个坏主意,因为当用户使用另一种语言的应用程序但看到以他们自己的语言格式化的数字时,实际上可能会感到非常困惑(通常,如果您理解英语,即使您的母语也能理解英语数字格式)语言使用逗号而不是句点作为小数分隔符——我非常清楚这一点,因为我经常收到困惑的用户对我自己的应用程序的问题,他们尝试用句点输入数字,即使他们的语言环境需要逗号)。

于 2012-12-05T11:41:46.670 回答
0
@interface ABNumberFormatter : NSNumberFormatter
@end


@implementation ABNumberFormatter

-(NSString *)stringForObjectValue:(id)obj
{
    static NSArray *names;
    if (!names) names = @[@" Bin", @" Milyon", @" Milyar", @" Trilyon"];
    double value = ((NSNumber*)obj).doubleValue;
    for (NSUInteger expo = 4; expo > 0; --expo)
    {
        double number = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:expo*3 isNegative:NO].doubleValue;
        if (value >= number)
        {
            self.positiveSuffix = names[expo];
            return [super stringForObjectValue:@(value / number)];
        }
    }
    return [super stringForObjectValue:obj];
}
@end

名字是土耳其语。

于 2013-03-11T08:14:24.040 回答