我有一个带有Table View的简单Cocoa应用程序。表的每个单元表示浮点值。浮点数存储在一个具有5个浮点属性的对象中,其属性与我为表视图中的列设置的标识符相匹配。
我已经设法将它们全部连接起来,以便存储的浮点值可以编辑,除了有问题的数字恰好是1,000或更多时,它都能很好地工作。在这种情况下,输入数字后,它将返回到以逗号格式化的表格视图。
到目前为止一切顺利,除非您输入带逗号的数字,否则逗号转换后会丢失逗号之后的所有内容。
所以,例如:
问题在于最后三个例子。对于数字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
对我来说,似乎很奇怪,浮点数被浮点数转换为字符串转换,但字符串无法正确理解正在发生的浮点转换。
有关如何使其以预期方式运作的任何建议吗?
答案 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提供以下评论,导致只创建一个格式化程序,而不是每次调用创建和销毁一个格式化程序。