1

我有一个带有表格视图的简单 Cocoa 应用程序。表格的每个单元格代表一个浮点值。浮点数存储在具有 5 个浮点属性的对象中,其名称与我为表视图中的列设置的标识符相匹配。

我已经设法将它们全部连接起来,以便存储的浮点值是可编辑的,除了当问题的数字恰好是 1,000 或更多时,这一切都很好。在这种情况下,输入数字后,它会返回到用逗号格式化的表格视图。

到目前为止一切顺利,除非您输入一个带有逗号的数字,否则逗号之后的所有内容都会在浮点转换中丢失。

因此,例如:

  • 45.0 变为 45
  • 999.9 变成 999.9
  • 0 变成 0.0(不知道为什么小数点显示为零)
  • 1000 变成 1,000
  • 1,000 变成 1
  • 2,312 变成 2

所以问题出在最后三个例子上。对于 1000 或更大的数字,会自动插入逗号,但如果输入逗号,则无法正确解释。

我没有在我的代码中明确地进行浮点转换,当我在属性上调用 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,将其格式设置为十进制样式并调用 numberFromString。然后可以将此 NSNumber 对象发送到期望浮点数的对象。

更新了以下相关方法的代码...

- (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 对象是在数据处理类的初始化阶段创建的,如下所示:

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

编辑感谢@yinkou 下面的评论导致只创建一个格式化程序,而不是每次调用创建和销毁一个格式化程序。

于 2013-03-18T10:00:46.030 回答