我真的想要实现像'UILabel + formattedText'这样的类,它允许我执行一个方法,可以很好地格式化标签的可见显示中的文本,但任何查看label.text的代码只会看到未格式化的数字字符串。我知道这可能很简单。事情是,我似乎无法找到它的语法。这究竟如何运作?
这是视图控制器中方法的粗略草稿:
- (void)UpdateLabels{
if(!formatter){//initialize formatter if there isn't one yet.
formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setPositiveFormat:@",##0.##"];
[formatter setNegativeFormat:@",##0.##"];
[formatter setMaximumFractionDigits:15];
[formatter setMaximumIntegerDigits:15];
}
NSRange eNotation =[rawDisplay rangeOfString: @"e"];//if there's an 'e' in the string, it's in eNotation.
if ([rawDisplay isEqual:@"Error"]) {
display.text=@"Error";
backspaceButton.enabled = FALSE;
}else if (eNotation.length!=0) {
//if the number is in e-notation, then there's no special formatting necessary.
display.text=rawDisplay;
backspaceButton.enabled =FALSE;
} else {
backspaceButton.enabled =([rawDisplay isEqual:@"0"])? FALSE: TRUE; //disable backspace when display is "0"
//convert the display strings into NSNumbers because NSFormatters want NSNumbers
// then convert the resulting numbers into pretty formatted strings and stick them onto the labels
display.text=[NSString stringWithFormat:@"%@", [formatter stringFromNumber: [NSNumber numberWithDouble:[rawDisplay doubleValue]]]];
}
}
所以我基本上至少希望标签绘图功能进入标签。这样的代码是否适用于MVC?这是我的第一次尝试。
同样,当我在这里的时候,我也可以问:这是一个双数字相对较少的数字。但是,当我尝试将双倍更改为longlong等其他内容时,我会得到非常奇怪的结果。我怎样才能获得更高的精确度并仍然完成所有这些操作?
答案 0 :(得分:1)
我建议写一个UILabel的子类。由于您只想更改文本的显示方式,因此您只需编写自定义drawTextInRect:
方法即可。它将使用self.text
中的值格式并绘制结果字符串。然后你只需要更改应该格式化的任何标签的类。
示例:
@interface NumericLabel : UILabel {}
@end
@implementation NumericLabel
- (void)drawTextInRect:(CGRect)rect {
static NSNumberFormatter *formatter;
NSString *text = nil, *rawDisplay = self.text;
if(!formatter){
//initialize formatter if there isn't one yet.
}
NSRange eNotation =[rawDisplay rangeOfString: @"e"];//if there's an 'e' in the string, it's in eNotation.
if ([rawDisplay isEqual:@"Error"]) {
text = @"Error";
}else if (eNotation.length!=0) {
text = rawDisplay;
} else {
text=[formatter stringFromNumber: [NSNumber numberWithDouble:[rawDisplay doubleValue]]];
}
[text drawInRect:rect withFont:self.font lineBreakMode:self.lineBreakMode alignment:self.textAlignment];
}
@end