NSNumberFormatter работает с десятичным разделителем, но не с запятой.

Я работаю над этим уже два дня. Время обратиться к 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.

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


person ndpmcintosh    schedule 08.09.2011    source источник
comment
не понял режим разделителя запятой. Где и как вам это нужно? Приведите небольшой пример. Мы исправим это быстро.   -  person SayeedHussain    schedule 08.09.2011
comment
Спасибо. На самом деле я обнаружил, что проблема вызвана использованием символа , в моей строке ввода числа, которая затем преобразуется в двойное значение для отправки в класс анализатора для обработки (это тип калькулятора). У меня есть настройка, которая позволяет выбирать десятичный разделитель между точкой (.) или запятой (,). Проблема возникает, когда для кнопки ввода разделителя установлено значение ,. Анализатор не примет строку как двойную при отправке с [[self Analyzer_] setFirstOperand:[[display_ text] doubleValue]], если в ней есть , . Поэтому я пытаюсь понять, как заставить это работать.   -  person ndpmcintosh    schedule 09.09.2011
comment
И еще кое-что. Я знаю, что есть некоторые методы локализации, которые могут устанавливать десятичные разделители и разделители группирующих символов, но я еще не понял, как заставить их работать. Я хочу сделать это, чтобы это выглядело естественно в местах, где числа отформатированы как 3,324,084, а не как 3,324,084. Если я оставлю заголовок кнопки-разделителя как . в режиме запятой он работает, за исключением того, что пользователь должен видеть неправильный десятичный формат при его вводе до тех пор, пока не будет нажата кнопка операции, а затем дисплей немедленно переформатирует его, чтобы использовать форму запятой, и вычисления будут завершены правильно. Функционально, но некрасиво.   -  person ndpmcintosh    schedule 09.09.2011


Ответы (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]];   
} 
person ndpmcintosh    schedule 09.09.2011