Форматирование ObjC Десятичные разряды с плавающей точкой на строку - PullRequest
2 голосов
/ 14 марта 2011

Как мне отформатировать число с плавающей запятой в строку, чтобы, если пользователь вводил число с двумя или менее десятичными разрядами, оно форматировалось так, чтобы иметь 2 десятичных знака, но если пользователь вводит число с плавающей запятой с 2 ​​или более десятичными знаками тогда отображаются все десятичные разряды. например

4.1 => 4.10
1 => 1.00
1.358484 => 1.358484

Таким образом, поэтому форматирование должно быть до 2 десятичных разрядов или более, если необходимо.

Надеюсь, я понял.

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

это может сработать для вас:

NSNumber *aFloat = [NSNumber numberWithFloat:1.2]; //try 1.234 ; 1.23 ; 1.2 ; 1. ; 1
NSString *numberString = [aFloat stringValue];
NSRange dot;
dot = [numberString rangeOfString:@"."];
NSString *finalString;
if (dot.location != NSNotFound) {
    NSString *decimals = [numberString substringFromIndex:dot.location + dot.length];
    if (decimals.length<1){ // ends with "."
        finalString = [numberString stringByAppendingString:@"00"];
    }else if (decimals.length<2){ // ends with ".n"
        finalString = [numberString stringByAppendingString:@"0"];
    }else { // 2 or more decimals: no changes
        finalString = numberString;
    }
}else { // no decimals
    finalString = [numberString stringByAppendingString:@".00"];
}
NSLog(@"______._____finalString:%@", finalString );

РЕДАКТИРОВАТЬ (более гибкий, он работает с переменными числами десятичных дробей):

NSNumber *aFloat = [NSNumber numberWithFloat:1.1235]; //try 1.234 ; 1.23 ; 1.2 ; 1. ; 1
NSString *numberString = [aFloat stringValue];
NSRange dot;
dot = [numberString rangeOfString:@"."];
if (dot.location == NSNotFound) { // no decimals, add a dot
    numberString = [numberString stringByAppendingString:@"."];
    NSLog(@"__added dot___ numberString:%@", numberString );
}
dot = [numberString rangeOfString:@"."];
NSString *decimals = [numberString substringFromIndex:dot.location + dot.length];
//      int initialDecimals = decimals.length;
int numberOfDecimalsTerget = 2;

for (int initialDecimals = decimals.length; initialDecimals<numberOfDecimalsTerget; initialDecimals++) {
    numberString = [numberString stringByAppendingString:@"0"];
}
NSLog(@"__END_._____numberString:%@", numberString );
2 голосов
/ 14 марта 2011

Попробуйте что-то вроде этого.

BOOL requiresExtraPrecision (double num) {
    double roundedToHundredth = round(num * 100.0) / 100.0;
    double diff = num - roundedToHundredth;
    if (diff < 0) diff = 0.0 - diff;
    if (diff < 0.0000001) {
        return NO;
    } else {
        return YES;
    }
}

NSString *formatted (double num) {
    if (requiresExtraPrecision(num)) {
        return [NSString stringWithFormat:@"%F", num];
    } else {
        NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
        [formatter setMaximumFractionDigits:2];
        [formatter setMinimumFractionDigits:2];
        return [formatter stringFromNumber:[NSNumber numberWithDouble:num]];
    }
}

Как писал @Carl в комментарии к вопросу, сложная часть решает, когда двойному элементу нужна вся его точность.В этом коде я предполагаю, что если двойное число «достаточно близко» к округленному числу (в пределах миллионной доли), то мы должны просто отобразить округленное число.

Возможно, вы решите сделать его более строгим (на миллиард?), но вы всегда должны будете использовать какое-то приближение, потому что некоторые десятичные числа не могут быть сохранены точно как число с плавающей точкой.Несмотря на то, что пользователь мог ввести «0,1» во время ввода, эта информация теряется, когда число сохраняется как число с плавающей запятой.

Итак, учитывая, что у вас будет число с плавающей запятой, которое очень близко к десятичному, ноне совсем верно, вам придется решить, когда вы думаете, что число с плавающей точкой "достаточно близко" к десятичному числу.

Если вам нужна абсолютная точность (если вы работаете с деньгами!), тогда вам следует рассмотреть возможность использованияNSDecimal или NSDecimalNumber вместо числа с плавающей запятой.

...