NSNumberFormatter работает с десятичным разделителем, но не с запятым
Я работаю над этим уже два дня. Время проконсультироваться со stackru.
У меня есть пользовательская настройка 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 ответ
Я смог понять это самостоятельно. Числовой форматер работал правильно. Чтобы заставить мой класс анализатора работать, я должен был отправить ему двойное число, которое не могло бы содержать разделитель запятой. Но чтобы дисплей выглядел правильно в режиме разделителя запятых, мне пришлось отправить строку в нужном формате на дисплей (например, 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]];
}