我一直在研究计算器应用,但我发现了 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 :)
答案 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];
}
}