我想通过使用“K”代表数千,“M”来代表数百万等来缩短货币数量。
由于数字代表货币值,我还使用NSNumberFormatter
根据设备的值,货币和区域设置正确格式化每个数字。
我已经分别做了1和2,但我很难在一起做两件事。起初我尝试将缩写添加到NSNumberFormatter
的正确格式化的输出字符串中(例如,将“K”附加到“$ 10.3”以获得“$ 10.3K”)。
这适用于大多数货币,直到我遇到区域格式,在数字值后显示货币符号(例如“+10.3 $ US”将变为“+10.3 $ USK”而不是“ + 10.3K $ US“)。
我不确定是否有一种简单的方法可以确定货币符号是在给定货币和区域设置的数值之前还是之后。有关解决方案的任何建议吗?
提前致谢。
答案 0 :(得分:3)
有趣的问题! iOS库不支持这个(我从未在其他平台上看到这种格式支持在语言环境定义中),所以你很难做自己的实现。
使用字母K和M本身的惯例可能在其他语言环境中不起作用。例如M对法语使用者来说很困惑,因为“mille”,“million”和“milliard”(法语单词千万,百万和十亿)都以字母M开头,我只见过 K 与金钱一起使用时常用法语(我是母语人士),在某些领域(如地理位置)使用小写 m 和大写 M 表示百万和十亿分别。
也许您应该权衡这是否必须在所有区域设置中,或者是否有其他方式来呈现您的信息。您可以随时执行缩写为您知道它工作的语言环境(例如en_US)的实现,并将非缩写数字用于其他语言环境。
另一个建议是以活动语言为基础而不是使用iOS区域格式(即通过localizable.strings
文件中的格式字符串自行决定货币的位置,数字和字母K,所以翻译人员可以根据您的每种语言进行必要的修改。你仍然会得到依赖于语言环境的小数点,但其他一切都将由你的本地化决定。这并不是一个糟糕的主意,因为用户在使用其他语言的应用程序时可能会感到非常困惑,但是看到的数字是用他们自己的语言格式化的(通常,如果你理解英语,你也会理解英语数字格式,即使你的本地人语言使用逗号代替句点作为小数分隔符 - 我非常了解这一点,因为我经常通过混淆用户为我自己的应用程序提问,他们尝试使用句点输入数字,即使他们的语言环境需要逗号)。
答案 1 :(得分: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
名字是土耳其语。