2013-08-09 1 views
1

Здесь я использую NSNumberFormater, чтобы установить максимальное количество десятичных знаков в два-два. Кажется, он работает нормально, но когда я пытаюсь преобразовать его обратно в double, из строки, сгенерированной NSNumberFormater, как вы можете видеть на выходе NSLog, любое десятичное число удаляется и заменяется конечными нулями. Почему это?doubleValue из NSString, десятичные разряды удаляются

- (double)randomDoubleBetween:(double)smallNumber and:(double)bigNumber { 
    double diff = bigNumber - smallNumber; 
    double ranNum = (((double) (arc4random() % ((unsigned)RAND_MAX + 1))/RAND_MAX) * diff) + smallNumber; 

    NSNumberFormatter *doubleValueWithMaxDecimalDigits = [[NSNumberFormatter alloc] init]; 
    [doubleValueWithMaxDecimalDigits setNumberStyle:NSNumberFormatterDecimalStyle]; 
    [doubleValueWithMaxDecimalDigits setMaximumFractionDigits:2]; 
    NSNumber *num = [NSNumber numberWithDouble:ranNum]; 

    NSString *valueToReturn = [doubleValueWithMaxDecimalDigits stringFromNumber:num]; 
    NSLog(@"String value %@", valueToReturn); 

    NSLog(@"Double value converted from string %f", [valueToReturn doubleValue]); 
    return [valueToReturn doubleValue]; 
} 

NSLog выход:

2013-08-09 02: 25: 05,031 Г.Г. [27947: 907] Строка Значение 176,19

2013-08-09 02:25: 05,035 Г.Г. [27947: 907] Двойное значение преобразуется из строки 176,000000

+0

Почему вы форматированием, что в первую очередь? –

+0

@Josh: Мне нужно ограничить число десятичных знаков –

ответ

4

Похоже, -[NSString doubleValue] не соблюдая локалите десятичный разделитель; он ожидает точку, а не запятую.

// US uses point as decimal separator 
[doubleValueWithMaxDecimalDigits setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"]]; 

NSString *valueToReturn = [doubleValueWithMaxDecimalDigits stringFromNumber:num]; 

// Correctly includes fractional part 
NSLog(@"Double value converted from string %lf", [valueToReturn doubleValue]); 

// Italy uses a comma 
[doubleValueWithMaxDecimalDigits setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"it_IT"]]; 
valueToReturn = [doubleValueWithMaxDecimalDigits stringFromNumber:num]; 

// Drops fractional part 
NSLog(@"Double value converted from string %lf", [valueToReturn doubleValue]); 

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

(Кроме, ваш формат спецификатор неправильно, используйте %lf для double.)

+0

Формирование на строку, кажется, единственный способ ограничить число десятичных знаков. Что вы сказали о запятой! Я только это заметил. –

+1

@Tom: [Получить двухзначное округленное значение поплавка] (http://stackoverflow.com/q/18063721) –