1

Table View を備えたシンプルな Cocoa アプリがあります。テーブルの各セルは、浮動小数点値を表します。フロートは、5 つのフロート プロパティを持つオブジェクトに格納されます。その名前は、テーブル ビューの列に設定した識別子と一致します。

格納された浮動小数点値が編集可能になるようにすべてを接続することができました。問題の数値がたまたま 1,000 以上の場合を除いて、すべてうまく機能します。この場合、番号を入力した後、カンマでフォーマットされたテーブル ビューに戻ります。

これまでのところ、コンマを含む数値を入力した場合を除いて、コンマの後のすべてが float 変換で失われます。

たとえば、次のようになります。

  • 45.0 が 45 になる
  • 999.9 が 999.9 になる
  • 0 は 0.0 になります (小数点がゼロとして表示される理由がわかりません)
  • 1000 が 1,000 になる
  • 1,000 が 1 になる
  • 2,312 が 2 になる

したがって、問題は最後の 3 つの例にあります。1000 以上の数字にはカンマが自動的に挿入されますが、カンマを入力すると正しく解釈されません。

コードで float 変換を明示的に行っているわけではありません。プロパティで setValueForKey を呼び出すとバック​​グラウンドで処理され、valueForKey を呼び出すと文字列変換が行われます。コード内で ID が渡されます。

私のデータコントローラーの関連コードは次のとおりです。

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    TCPointGroup *pg = [points objectAtIndex:row];
    NSString *ident = [tableColumn identifier];
    return [pg valueForKey:ident];
}

- (void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    TCPointGroup *pg = [points objectAtIndex:row];
    NSString *ident = [tableColumn identifier];
    [pg setValue:object forKey:ident];
}

そして、浮動小数点値を保持するオブジェクトの定義は次のとおりです。

@interface TCPointGroup : NSObject {

}

@property float pt_Xw;
@property float pt_Yw;
@property float pt_Zw;
@property float pt_xd;
@property float pt_yd;

+ (id)newWithArray:(NSArray*)array;
- (id)initWithArray:(NSArray*)array;

@end

フロートから文字列への変換によってコンマが挿入されるのは奇妙に思えますが、実行中の文字列からフロートへの変換では正しく理解されません。

期待どおりに動作させる方法について何か提案はありますか?

4

1 に答える 1

2

解決策を見つけたようです。NSNumberFormatter クラスは、コンマを含む浮動小数点数の文字列バージョンを理解できます。解決策は、NSNumberFormatter をインスタンス化し、その形式を 10 進数スタイルに設定して、numberFromString を呼び出すことです。この NSNumber オブジェクトは、float を期待するオブジェクトに送信できます。

以下の関連するメソッドの更新されたコード...

- (void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    NSNumber* value = [_formatter numberFromString:object];
    if( value ) {
        TCPointGroup *pg = [points objectAtIndex:row];
        NSString *ident = [tableColumn identifier];
        [pg setValue:value forKey:ident];
    }
}

_formatter オブジェクトは、データ処理クラスの init フェーズで次のように作成されます。

    _formatter = [[NSNumberFormatter alloc] init];
    [_formatter setNumberStyle:NSNumberFormatterDecimalStyle];

編集呼び出しごとにフォーマッタを作成して破棄するのではなく、フォーマッタを 1 つだけ作成することにつながった以下のコメントについて、@yinkou に感謝します。

于 2013-03-18T10:00:46.030 に答える