1

es_US ロケール (x,xxx.xx) の .txt ファイルから現在のロケール es_ES(x.xxx,xx) に金額をフォーマットしようとしています。[NSNumberFormater numberFromString] は文字列を再フォーマットするだけだと思いますが、このメソッドからは nil 値しか得られません。

here からの回答を確認した後、別のアプローチも試しましたが、文字列に千の区切り文字がある場合、NSDecimalnumber は機能しません。

 - (void) setSaldo_sap:(NSString *)saldo_sap
 {
    NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];

    [numFormatter setLocale:[NSLocale currentLocale]];
    [numFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [numFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [numFormatter setNegativeFormat:@"-¤#,##0.00"];

    //saldo_sap = @"         -324,234.55"
    NSString * tmpString = [saldo_sap stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    NSNumber *num = [numFormatter numberFromString:tmpString];
    NSDecimalNumber *tempNumber = [NSDecimalNumber decimalNumberWithString:tmpString];  

    _saldo_sap = [numFormatter stringFromNumber:tempNumber];        
}
4

2 に答える 2

1

NSNumberFormatterの目的を誤解していると思います。それは、設定されたルールに従ってフォーマットされた数値を「再フォーマット」せず、「フォーマット」および「解析」します。したがって、「es_US」ロケールで番号が入力されているが、「es_ES」を使用して番号をフォーマットする場合は、ロケールごとに1つずつ、合計2つのNSNumberFormatterが必要になります。

着信番号を「es_US」で解析し、「es_ES」を使用してフォーマットし、少し単純化します(これらの2つのロケールと番号の正確なフォーマットがわからないため、少し調整する必要があるかもしれません)。

NSString * tmpString = ...

NSNumberFormatter *usFormatter = [[NSNumberFormatter alloc] init];
[usFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier: @"es_US"] autorelease]];
[usFormatter setHasThousandSeparators: YES];

NSNumberFormatter *esFormatter = [[NSNumberFormatter alloc] init];
[esFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier: @"es_ES"] autorelease]];
[esFormatter setHasThousandSeparators: YES];

// this assignment looks also somewhat weird: is it an instance variable? 
// 'cause if it is and you assign an autoreleased string you'll have a bad pointer there
_saldo_sap = [esFormatter stringFromNumber: [usFormatter numberFromString: tmpString]];

// And unless you use ARC you leak your formatter on each call, so at the end
[usFormatter release];
[esFormatter release];

編集 入力文字列にプレフィックス/ポストフィックス文字が含まれている場合、NSNumberFormatterが機能しなくなる可能性があります(通常はかなり厳密に使用されます)。次を使用しますsetLenient:

「受信者がヒューリスティックを使用して、文字列が意図する数を推測するかどうかを設定します。」

変換する数値が複数ある場合は、数値ごとにフォーマッタを作成しないでください。これは、メモリとCPUの浪費にすぎません。それらをインスタンス変数にして再利用します。1つのフォーマッターを使用して、あるフォーマットの解析と別のフォーマットでのフォーマットの間で再構成するよりもはるかに明確になります。

于 2012-07-10T11:47:23.130 に答える
-1
NSString *_saldo_sap = @"         -324234.55";
//NSString *_saldo_sap = @"         324,234.55";

NSString * tmpString = [_saldo_sap stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//tmpString = @"-324,234.55"

NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];
NSNumber *num = [numFormatter numberFromString:tmpString];

[numFormatter setLocale:[NSLocale currentLocale]];
[numFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numFormatter setNegativeFormat:@"-¤#,##0.00"];

_saldo_sap = [numFormatter stringFromNumber:num];

まず、NSString から NSNumber を取得するには、文字列が正しく読み取り可能な形式である必要があります。次に、最初に文字列を NSNumber に変換してから、それに応じてフォーマットする必要があります。

于 2012-07-10T12:14:41.413 に答える