4
  1. 千を表す場合は「K」、百万を表す場合は「M」などを使用して、通貨の数字を短縮したいと考えています。

  2. 数字は通貨の値を表すためNSNumberFormatter、デバイスの値、通貨、地域設定に従って各数字を適切にフォーマットするためにも使用しています。

1と2は別々にできましたが、両方を同時に行うのは難しいです。最初は、適切にフォーマットされた出力文字列に略語を単純に追加しようとしましたNSNumberFormatter(たとえば、「K」を「$10.3」に追加して「$10.3K」を取得します)。

これは、数値の後に通貨記号を表示する地域形式に遭遇するまで、ほとんどの通貨で機能しました(たとえば、「+10.3 $US」は「+10.3K $US」ではなく「+10.3 $USK」になります)。

特定の通貨と地域の設定で、通貨記号が数値の前か後かを判断する簡単な方法があるかどうかはわかりません。これに対する解決策について何か提案はありますか?

前もって感謝します。

4

2 に答える 2

4

面白い問題!iOS ライブラリはこれをサポートしていません (そして、この種の形式が他のプラットフォームのロケール定義でサポートされているのを見たことがありません) ので、独自の実装を行うことになります。

文字 K と M を使用するという規則自体は、他のロケールでは機能しない可能性があります。たとえば、「ミル」、「ミリオン」、「ミリアード」(千、百万、十億を表すフランス語)はどちらも文字 M で始まるため、M はフランス語を話す人にとって混乱を招きます。金額で (私はネイティブ スピーカーです)、小文字の mと大文字のMの両方が、地理学などの一部の分野でそれぞれ百万と十億を表すために使用されます。

おそらく、これがすべてのロケールで必須であるかどうか、または情報を表示する他の方法があるかどうかを検討する必要があります. 機能することがわかっているロケール (en_US など) の省略形を常に実装し、他のロケールでは省略されていない番号を使用できます。

もう 1 つの提案は、これをアクティブな言語に基づいており、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 に答える