我在我的View Controller中尝试了这个方法,但我真的很喜欢它在Label中

时间:2011-07-03 03:28:24

标签: ios uilabel categories nsnumberformatter

我真的想要实现像'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等其他内容时,我会得到非常奇怪的结果。我怎样才能获得更高的精确度并仍然完成所有这些操作?

1 个答案:

答案 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