如何阻止逗号在Cocoa中破坏我的浮动转换?

时间:2013-03-17 22:57:18

标签: cocoa nsstring

我有一个带有Table View的简单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时发生字符串转换时,它正在幕后处理 - 在我的代码中传递了ids。

以下是我的数据控制器中的相关代码:

- (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

对我来说,似乎很奇怪,浮点数被浮点数转换为字符串转换,但字符串无法正确理解正在发生的浮点转换。

有关如何使其以预期方式运作的任何建议吗?

1 个答案:

答案 0 :(得分: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提供以下评论,导致只创建一个格式化程序,而不是每次调用创建和销毁一个格式化程序。