2014-02-10 1 views
1

Я работаю над калькулятором, которое работает с удвоениями, а затем, когда вы нажимаете, выполняется операция с удвоением, а затем переключается на NSNumberFormatter. Моя проблема в том, когда пользователь хочет добавить (или -, /, *) номер к ответу на экране. Если номер на экране не имеет запятых, все работает нормально, если на номере на экране есть запятые, я получаю случайное число вместо правильного ответа. Какие-либо предложения?Проблемы с NSNumberFormatter

вот мой код для кнопки равенства. У меня такой же код для каждой операции. Пожалуйста, простите моего ужасное именование

также test.firstnumbers является аа строкой, которая хранит число до того, как пользователь вводит во втором наборе чисел для математических задач

double number = [test.firstNumbers doubleValue]; 

    double otherNumber = [self.label.text doubleValue]; 

    double answer = number + otherNumber; 

    NSNumberFormatter *finalAnswer = [[NSNumberFormatter alloc]init]; 

    [finalAnswer setNumberStyle:NSNumberFormatterDecimalStyle]; 

    self.label.text = [finalAnswer stringFromNumber:[NSNumber numberWithDouble:answer]]; 

ответ

2

двойного otherNumber = [самоуправление. labelTwo.text doubleValue];

Вы никогда не захотите использовать представление, отображающее результаты в качестве хранилища для ваших данных. Это нарушение парадигмы MVC и, как правило, плохой план. Вы должны иметь номер на дисплее, хранящийся в вашей модели данных (даже если эта «модель» так же просто, как переменная экземпляра в вашем контроллере представлений). Среди других преимуществ это позволяет избежать необходимости преобразования числа в текст, а затем обратно в число и, следовательно, полностью избегает проблемы, с которой вы сталкиваетесь с запятыми.

Если вы рассматриваете прямую причину проблемы, вы используете метод NSString -doubleValue для преобразования из строки в число, но с использованием числа форматирования чисел для преобразования из числа в строку. Как вы видели, они не совсем дополняют друг друга. Используйте формат числа для обоих преобразований, и вам повезет больше. Но, опять же, вы действительно не должны использовать представление для хранения операнда.

+1

ОК, спасибо, это очень помогло! (я обновил код, но я понял, что у меня была опечатка в коде с тегом 'labelTwo'.Хотя я не думаю, что это на самом деле меняет ответ) – user3186310

0

Я согласен с Caleb, вы можете разделить модель (вычисление чисел) с остальными видами + контроллерами.

Однако, я думаю, что проблема заключается в преобразовании «двойного значения» из строки: заменить все запятые на точки могут быть трюком.

+0

Анимация показывает «22,222,223». Если вы замените запятые точками, вы получите «22.222.223». Это не лучше. –

+0

Ты прав. Я объясняю это так, потому что нотация итальянского номера не использует другие запятые для тысяч. Поэтому вам нужно удалить другие запятые, а не десятичную, и заменить их точкой. –

1

Это не случайно, это вполне предсказуемо, но неправильно, потому что doubleValue не интерпретирует запятые.

Если текущая строка отображаемая 22,222,223 и вы пытаетесь добавить 2, вы пытаетесь получить двойное значение 22,222,223 с помощью doubleValue. Но doubleValue не понимает запятые, поэтому он останавливается, когда достигает первого. Итак, вместо 22222223 вы получаете значение 22. Код добавляет 2 к нему и получает 24, что и есть то, что вы видите.

Чтобы прочитать и разобрать число, содержащее запятые, вы должны снова использовать NSNumberFormatter, на этот раз с помощью метода numberForString. Но, как указывает @Caleb, это очень плохой дизайн. Вы должны хранить значение в атрибуте где-то в коде и использовать его при выполнении математики. Не читайте данные из пользовательского интерфейса, если только это не то, что пользователь только что ввел. Никогда не записывайте данные в пользовательский интерфейс, а затем читайте его, если только пользователь не может изменить эти данные.

+0

Спасибо, это помогает тонну! – user3186310