Преобразование NSNumberFormatter удаляет десятичное число для небольших значений

Наша команда обеспечения качества обнаруживает дефект. Когда они пишут 0.095 или 0,095 в поле валюты, NSNumberFormatter преобразует содержимое в 95.

Это код, который мы используем:

+ (NSNumber *) getNumberWithDecimalFromString:(NSString*) theSource
{
    if ([TSCommons isEmpty:theSource])
        return [[NSNumber alloc] initWithInt:0];

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

    if ([theSource rangeOfString:@","].location != NSNotFound) {
        [formatter setDecimalSeparator:@","];
        [formatter setCurrencyDecimalSeparator:@"."];
    } else if ([theSource rangeOfString:@"."].location != NSNotFound) {
        [formatter setDecimalSeparator:@"."];
        [formatter setCurrencyDecimalSeparator:@"."];
    }
    NSNumber *tmp = [formatter numberFromString:theSource];

    [formatter release];
    return [tmp retain];
}

Регион: es_ES

Любая идея об этом неожиданном поведении?

Чтобы представить больше информации об этой проблеме, потому что вернитесь снова после последнего обновления XCode, я подготовил тест

- (void) testNumberFormatter
{
    NSLog(@"%f",[[TSCommons getNumberWithDecimalFromString:@"41,1"] doubleValue]);
    NSLog(@"%f",[[TSCommons getNumberWithDecimalFromString:@"41,12342"] doubleValue]);
    NSLog(@"%f",[[TSCommons getNumberWithDecimalFromString:@"41,12"] floatValue]);
    NSLog(@"%f",[[TSCommons getNumberWithDecimalFromString:@"41,123"] floatValue]);
    NSLog(@"%f",[[TSCommons getNumberWithDecimalFromString:@"41,1234"] floatValue]);
    NSLog(@"%f",[[TSCommons getNumberWithDecimalFromString:@"41,1234234"] doubleValue]);
}

Результат в консоли следующий:

41.100000

41.123420

41.119999

41123.000000

41.123402

41.123423

Спасибо!!


person Iván Peralta    schedule 28.02.2013    source источник
comment
Проверяли ли вы строковое значение theSource перед использованием [formatter numberFromString:theSource]? Как вы выводите NSNumber? Пробовал дома, работает.   -  person Mr Bonjour    schedule 28.02.2013
comment
Если я применяю к NSNumber значение doubleValue или floatValue, результат равен 95. Если я отлаживаю, описание NSNumber длинное (95)   -  person Iván Peralta    schedule 28.02.2013


Ответы (1)


 NSString* theSource = @"0.095";
        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
        [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

        if ([theSource rangeOfString:@","].location != NSNotFound) {
            [formatter setDecimalSeparator:@","];
            [formatter setCurrencyDecimalSeparator:@"."];
        } else if ([theSource rangeOfString:@"."].location != NSNotFound) {
            [formatter setDecimalSeparator:@"."];
            [formatter setCurrencyDecimalSeparator:@"."];
        }
        NSNumber *tmp = [formatter numberFromString:theSource];
        NSLog(@"get Number %@ - %lf %lf", tmp, [theSource doubleValue], [tmp floatValue]);

// вывод получаем число 0,095 - 0,095000 0,095000

person Mr Bonjour    schedule 28.02.2013