web-dev-qa-db-ja.com

カンマ小数点区切りのNSNumberFormatter

「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など)があります。

私がこれをどのように処理できるか知っていますか?

19
Pierre

だから質問は有効です:私は自分で答えています:)

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

問題が解決しました。

26
Pierre

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

 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

var-name "numberFromString"はNSNumberFormatterメソッドなので、使用しません。幸運を!

42
JFS

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

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

Intsでも機能します。

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

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

6
mxcl
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
numberFormatter.usesGroupingSeparator = YES;
[numberFormatter setMaximumFractionDigits:2];
[numberFormatter setMinimumFractionDigits:2];
NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.00];`

これにより、小数点を処理する場合の切り上げの問題が修正されます。

3
Rinku

通貨用...

let numberFormatter = NumberFormatter()

// Produces symbol (i.e. "$ " for en_US_POSIX) and decimal formatting
numberFormatter.numberStyle = .currency

// Produces commas; i.e. "1,234"
numberFormatter.usesGroupingSeparator = true
numberFormatter.groupingSize = 3

使用例:

let value: Double = 12345.6789
numberFormatter.string(from: value as NSNumber)

利回り...

"$ 12,345.68"

予想通り

3