1

我真的想实现一个像“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 是真的吗?这是我的第一次尝试。

另外,当我在这里时,我不妨问一下:这进入 e 表示法,数字相对较少作为双精度数。但是,当我尝试将 double 更改为 longlong 之类的其他内容时,我得到了非常奇怪的结果。我怎样才能获得更高的精度并且仍然可以进行所有这些操作?

4

1 回答 1

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
于 2011-07-03T05:39:56.563 回答