NSNumberFormatter / Logic缺陷导致我在计算器应用程序中的UILabel中不显示或显示3个点

时间:2014-07-08 06:00:11

标签: ios objective-c

我一直在研究计算器应用,但我发现了 NSNumberFormatter 中可能缺少的逻辑漏洞或其他内容。

问题,基本上如果用户按下点(。)不止一次显示我的字符串的ULabel被删除,如果它一直按下它显示最多3个点(...)

示例 - > 234 ...或''(空白/无)

所以,这些是我的 NSNumberFormatter 函数,它们负责将我的字符串转换为23,000或23,452.22或243,002,123(只是处理逗号分隔符并且不超过6位小数(只是)让它更好)..

// take the current value of self.inputString, and use NSNumberFormatter to give us a @"1,234,567.89" string.
- (NSString *)fancyString {
    NSNumberFormatter *numberFormat = [[NSNumberFormatter alloc] init];

    numberFormat.usesGroupingSeparator = YES;

    numberFormat.groupingSeparator = @",";

    numberFormat.groupingSize = 3;

    [numberFormat setMaximumFractionDigits:6];

   // if([inputString isEqualToString:@"."])
    [numberFormat setDecimalSeparator:@"."];

    [numberFormat setNumberStyle:NSNumberFormatterDecimalStyle];

    return [numberFormat stringFromNumber:self.numericalValue];
} 

// ******** CONTINUE FORMATTER
// take the current value of self.inputString, and use NSNumberFormatter to give us a number, as a NSNumber, like 1234567.89
- (NSNumber *)numericalValue {

    NSNumberFormatter *numberFormat = [[NSNumberFormatter alloc] init];

    [numberFormat setNumberStyle:NSNumberFormatterDecimalStyle];

    self.number = [numberFormat numberFromString:self.Screen.text];

    return [numberFormat numberFromString:self.inputString];
}

现在,仅供您参考和更好地理解我的程序,这是我如何处理计算器上按下的每个数字..(它对所有数字重复相同的方式)

// ********* WHEN A BUTTON OR NUMBER OR DIGIT IS PRESSED... (THE SAME FOR ALL NUMBERS)
-(IBAction)Number9:(UIButton *)sender{
    [self appendDigit:@"9"];
}

-(IBAction)Number0:(UIButton *)sender{
    [self appendDigit:@"0"];
}

// ********** THIS FUNCTION IS PART OF MY PROBLEM BECAUSE GETS CALL WHEN THE . IS PRESSED..
- (IBAction)Dot:(UIButton *)sender {    
    self.currentText = Screen.text;
    if ([currentText rangeOfString:@"." options:NSBackwardsSearch].length == 0) {
        [self appendDigit:@"."];
    }

}

最后,以及最重要的!!! 如果问题与我的 NSNumberFormatter 无关,那么它可能发生的逻辑缺陷,这就是我追加的方式每个数字到我的字符串,然后显示到我的 UILabel ..

//********** THEN THIS WHERE I APPEND OR CONTROL THE DISPLAY OF MY LABEL WITH THE FUNCTION appendDigit.. AND WHERE THE PROBLEM IS..

// THE PROBLE IS BECAUSE IM USING A FORMATTER FOR A FANCY STRING EXAMPLE -> 2,500 or 325,000,200 IF THE DUMMY USER PRESSES THE . (Dot) MORE THAN ONCE WHEN THE LENGTH OF MY LABEL IS 3+ THEN THE fancyString function GETS CALL BUT IT WONT HANDLE THE CASE OF MORE THAN ONE TIME THE . (Dot) IS PRESSED AND IT WILL CAUSE FIRST A FUNNY BLANK OUT SCREEN (nothing displayed) AND THEN IF PRESSED AGAIN .. or more (Dots) are displayed on the screen :( so bad!!!! indeed!! need helpt to fix it... PLEASE!!!!!!!

- (void)appendDigit:(NSString *)digit {

        // appending each digit to my string to be formatted later
        self.inputString = [self.inputString stringByAppendingString:digit];

        if([self.Screen.text length] > 0 && [self.Screen.text length] <= 15) {

            if([self.Screen.text length] > 2){    
                // displays and calls formatter for fancy or nice display of string
                self.Screen.text = [self fancyString];
            } else {
                // just display the digits appended so far
                self.Screen.text = inputString;
            }
}

注意:我试图切换我的函数 fancyString 的调用,但我无法让它工作以避免用户继续按下点(。)和字符串受它影响..

我将非常感谢帮助,意见和建议以及可以让我解决这个问题的一切......

谢谢, NorthBlast :)

1 个答案:

答案 0 :(得分:0)

我最终以这种方式解决问题,但如果有人有更好的方法,请告诉我.. !!!

- (void)appendDigit:(NSString *)digit {

    self.inputString = [self.inputString stringByAppendingString:digit];

    self.currentText = inputString;

    if([digit isEqualToString:@"."])
        controlDotFunction = YES;

        if([self.Screen.text length] > 0 && [self.Screen.text length] <= 15) {

            if(controlDotFunction && [self.Screen.text length] > 2) {

                self.Screen.text = [self.Screen.text stringByAppendingString:digit];
                controlDotFunction = NO;                                    

            } else {

                self.Screen.text = [self fancyString];

            }
}