NSNumberFormatter работает с десятичным разделителем, но не с запятым - PullRequest
1 голос
/ 08 сентября 2011

Я работаю над этим уже два дня. Время обратиться к stackoverflow.

У меня есть пользовательская настройка iOS, которая позволяет выбрать десятичный разделитель и разделитель группировки. Он отлично работает, когда разделитель представляет собой десятичную точку, но при установке десятичной запятой все числовые записи автоматически округляются до ближайшего целого числа, и любые вычисления теряют точность.

Схема такая:

//Use formatter to set decimal style for output
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMinimumFractionDigits:1];
[formatter setMaximumFractionDigits:5];

//Set number format from preferences
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *numberFormat = [userDefaults stringForKey:kNumberFormat];
if([numberFormat isEqualToString:@"Decimal Point"])
    {
    [formatter setDecimalSeparator:@"."];
    [formatter setGroupingSeparator:@","];
    }

    else
    {
    [formatter setDecimalSeparator:@","];
    [formatter setGroupingSeparator:@"."];
    }

NSNumber *number = [NSNumber numberWithDouble: result];
NSString* formattedResult = [formatter stringFromNumber:number];
[display_ setText: [NSString stringWithFormat:@"%@", formattedResult]];
[formatter release];

В режиме десятичного разделителя 5,5 + 5,5 = 11,0

Но в режиме разделителя запятых 5.5 сразу усекается до 5.0 на дисплее и 5.5 + 5.5 = 10.

Не то, что я хочу!

1 Ответ

1 голос
/ 09 сентября 2011

Я смог понять это самостоятельно. Числовой форматер работал правильно. Чтобы заставить мой класс анализатора работать, я должен был отправить ему двойное число, которое не могло бы содержать разделитель запятой. Но чтобы дисплей выглядел правильно в режиме разделителя запятых, мне пришлось отправить строку в нужном формате на дисплей (например, 2.500,05), затем переформатировать строку с десятичными точками и запятыми по мере необходимости и затем отправить эту строку анализатор как двойной (например, 2500.05). Немного сложно, так как я по сути меняю местами десятичные точки и запятые. Вероятно, есть более изящный способ сделать это, но это сработало:

NSString *numberFormat = [userDefaults stringForKey:kNumberFormat];

//if the string has been entered using a decimal comma, do this
if([numberFormat isEqualToString:@"Decimal Comma"])
{

 NSString *displayString = [display_ text];
 NSString *newStringValue = [displayString 
           stringByReplacingOccurrencesOfString:@"," withString:@"x"];
 newStringValue = [newStringValue 
           stringByReplacingOccurrencesOfString:@"." withString:@","];
 newStringValue = [newStringValue 
           stringByReplacingOccurrencesOfString:@"x" withString:@"."];
 [display_ setText:displayString];
 [[self analyzer_] setFirstOperand:[newStringValue doubleValue]];
}

//there is no problem if the decimal separator is a decimal point, so 
//just send it as is
if([numberFormat isEqualToString:@"Decimal Point"])

{   
 [[self analyzer_] setOperand:[[display_ text] doubleValue]];   
} 
...