22

「12000.54」のような NSString を「12.000,54」に変換しようとしました。NSNumberFormatter インスタンスを作成しました。

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setGroupingSeparator:@"."];
[formatter setDecimalSeparator:@","];

しかし、これを NSLog すると:

NSLog(@"%@",[formatter stringFromNumber:[formatter numberFromString:value]]);

null値を出力します。ポイントでコンマを変更すると、正しく機能します。セパレーターフィールド(カンマ、ポイント、スラッシュなど)に必要なものを入力できるようにしたいだけで、さまざまな出力があります:たとえば、12/000,54 12.000.54 12,000,54。

どうすればこれを処理できるか知っていますか?

4

5 に答える 5

47

iPhone のロケール設定に基づいて適切なセパレーターの動作を保証するために、セパレーターをハードコーディングしないことをお勧めします。これを行う最も簡単な方法は次のとおりです。

Objective-C の使用

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc]init];
numberFormatter.locale = [NSLocale currentLocale];// this ensures the right separator behavior
numberFormatter.numberStyle = NSNumberFormatterDecimalStyle;
numberFormatter.usesGroupingSeparator = YES;

// example for writing the number object into a label
cell.finalValueLabel.text = [NSString StringWithFormat:@"%@", [numberFormatter stringForObjectValue:numberFromString]]; // your var name is not well chosen

SWIFT 3 の使用

 let formatter = NumberFormatter()
 formatter.locale = NSLocale.current // this ensures the right separator behavior
 formatter.numberStyle = NumberFormatter.Style.decimal
 formatter.usesGroupingSeparator = true

 // example for writing the number object into a label
 // your variable "numberFromString" needs to be a NSNumber object
 finalValueLabel.text = formatter.string(from: numberFromString)! // your var name is not well chosen

変数名「numberFromString」はNSNumberFormatterメソッドであるため、使用しません。幸運を!

于 2013-06-23T15:39:58.063 に答える
28

したがって、質問は有効です:私は自分で答えています:)

sqlite から読み取った 10 進数値 (12000 または 12000.54 など) を NSString に直接変換しています。コードのある時点で別のセパレータを使用する必要があります。

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setGroupingSeparator:@""];
[formatter setDecimalSeparator:@"."];

// Decimal values read from any db are always written with no grouping separator and a comma for decimal.

NSNumber *numberFromString = [formatter numberFromString:@"12000.54"]];

[formatter setGroupingSeparator:@" "]; // Whatever you want here
[formatter setDecimalSeparator:@","]; // Whatever you want here

NSString *finalValue = [formatter stringFromNumber:numberFromString];

NSLog(@"%@",finalValue); // Print 12 000,54

問題が解決しました。

于 2013-04-21T15:04:20.570 に答える
7

私が最近見つけた最も簡単な解決策は次のとおりです。

NSString *localizedString = [NSString localizedStringWithFormat:@"%@", @1234567];

int でも動作します。

NSString *localizedString = [NSString localizedStringWithFormat:@"%d", 1234567];

Xcode 6 プレイグラウンドで検証済み。しかし、ドキュメントによると、この機能は常に存在していました。

于 2014-08-22T19:31:33.943 に答える
5
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
numberFormatter.usesGroupingSeparator = YES;
[numberFormatter setMaximumFractionDigits:2];
[numberFormatter setMinimumFractionDigits:2];
NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.00];`

これにより、小数点を扱っている場合の切り上げの問題が解決されます。

于 2014-07-09T10:07:40.130 に答える