Урок 19. Пишем простой калькулятор
Урок 19. Пишем простой калькулятор
Последний раз редактировалось damager82 28 апр 2017, 10:56, всего редактировалось 9 раз.
Re: Урок 19. Пишем простой калькулятор
Мне кажется, что для калькулятора переменные лучше объявить - double, а не float. Вычисления больших чисел будут точнее.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 19. Пишем простой калькулятор
Подскажите пожалуйста еще вот что. С проверкой деления на ноль проблем нет, но с проверкой на введенные значения, чтобы EditText's не были пустыми возникла сложность.
Провожу в начале проверку на пустые строки, но у меня программа не заходит в условие
Пробовал через .equals("") , но результат тот же. Что-то на подобие isEmpty() в андроиде не нашел.
Кстати на счет Float было бы интересно узнать в общем, стоит ли его использовать, либо нет. Читал что приложения на андроиде занимают в 2, а то и в 4 раза больше своего исходника, поэтому думаю наверное есть смысл и Float использовать где необходимо, но при этом будут некоторые сложности с явным приведением типов для Java кода, где многие функции так или иначе идут с double. Хотя я точно и не знаю какие библиотеки использует Android из Java, кроме Java.net
Код: Выделить всё
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
float num1 = 0;
float num2 = 0;
float result = 0;
//проверка на пустые строки
if ((etNum1.getText().toString()=="")||(etNum2.getText().toString()=="")){
Toast.makeText(this, "Недопустимая операция", 1000).show();
return;
}
//читаем EditText и заполняем переменные числами
num1 = Float.parseFloat(etNum1.getText().toString());
num2 = Float.parseFloat(etNum2.getText().toString());
// определяем нажатую кнопку и выполняем соответствующую операцию
// в oper пишем операцию, потом будем использовать в выводе
switch (v.getId()) {
case R.id.btnAdd:
oper = "+";
result = num1 + num2;
break;
case R.id.btnSub:
oper = "-";
result = num1 - num2;
break;
case R.id.btnMult:
oper = "*";
result = num1 * num2;
break;
case R.id.btnDiv:
if (num2==0) {
Toast.makeText(this, "Деление на ноль недопустимо", 1000).show();
etNum2.setText("");
return;
}
oper = "/";
result = num1 / num2;
break;
default:
break;
}
// формируем строку вывода
tvResult.setText(num1 + " " + oper + " " + num2 + " = " + result);
}
Код: Выделить всё
//проверка на пустые строки
if ((etNum1.getText().toString()=="")||(etNum2.getText().toString()=="")){
Toast.makeText(this, "Недопустимая операция", 1000).show();
return;
}
Кстати на счет Float было бы интересно узнать в общем, стоит ли его использовать, либо нет. Читал что приложения на андроиде занимают в 2, а то и в 4 раза больше своего исходника, поэтому думаю наверное есть смысл и Float использовать где необходимо, но при этом будут некоторые сложности с явным приведением типов для Java кода, где многие функции так или иначе идут с double. Хотя я точно и не знаю какие библиотеки использует Android из Java, кроме Java.net
Re: Урок 19. Пишем простой калькулятор
Попробуй получить длину строки из каждого элемента, а затем проверять по этой переменной. Вот нашел пример:
Код: Выделить всё
EditText loginText = (EditText)this.findViewById(R.id.login_name);
Integer nameLen = 8;
int len = loginText.length();
if (len<=0) {
loginText.setError(getText(R.string.error_required));
}
else if (len< nameLen) {
loginText.setError(getString(R.string.error_character_length, nameLen));
}
else {
nameId = loginText.getText().toString();
}
--[+++++++<---->>-->+>+>+<<<<]
<.>++++[-<++++<++>>>->--<<]>>-.>--..>+.<<<.<<-.>>+>->>.+++[.<]<<++.
<.>++++[-<++++<++>>>->--<<]>>-.>--..>+.<<<.<<-.>>+>->>.+++[.<]<<++.
Re: Урок 19. Пишем простой калькулятор
У меня сработала такая проверка
Добавлю ее в урок.
Код: Выделить всё
if ( TextUtils.isEmpty(etNum1.getText().toString()) || TextUtils.isEmpty(etNum2.getText().toString())) {
return;
}
Re: Урок 19. Пишем простой калькулятор
Возможно, в форуме уже это обсуждалось, но повторение как говорится.
Подробнее, решил немножко укоротить код и уменьшить католичество объектов путем другой настройки обработчика нажатия кнопки.
1. в компоновке main.xml после объявления каждой кнопки
<Button
добавил обработчик
android:onClick="myClick"
2. В коде MainActivity
удалил все объявления кнопок
// Button btnAdd;
// Button btnSub;
// Button btnMult;
// Button btnDiv;
инициализацию кнопок
// btnAdd = (Button) findViewById(R.id.btnAdd);
// btnSub = (Button) findViewById(R.id.btnSub);
// btnMult = (Button) findViewById(R.id.btnMult);
// btnDiv = (Button) findViewById(R.id.btnDiv);
удаляем вызов обработчика
// прописываем обработчик
// btnAdd.setOnClickListener(this);
// btnSub.setOnClickListener(this);
// btnMult.setOnClickListener(this);
// btnDiv.setOnClickListener(this);
3. Переименовываем
public void onClick(View v) {
в
public void myClick(View v){
все, результат тот же.
Подробнее, решил немножко укоротить код и уменьшить католичество объектов путем другой настройки обработчика нажатия кнопки.
1. в компоновке main.xml после объявления каждой кнопки
<Button
добавил обработчик
android:onClick="myClick"
2. В коде MainActivity
удалил все объявления кнопок
// Button btnAdd;
// Button btnSub;
// Button btnMult;
// Button btnDiv;
инициализацию кнопок
// btnAdd = (Button) findViewById(R.id.btnAdd);
// btnSub = (Button) findViewById(R.id.btnSub);
// btnMult = (Button) findViewById(R.id.btnMult);
// btnDiv = (Button) findViewById(R.id.btnDiv);
удаляем вызов обработчика
// прописываем обработчик
// btnAdd.setOnClickListener(this);
// btnSub.setOnClickListener(this);
// btnMult.setOnClickListener(this);
// btnDiv.setOnClickListener(this);
3. Переименовываем
public void onClick(View v) {
в
public void myClick(View v){
все, результат тот же.
Re: Урок 19. Пишем простой калькулятор
Да, код значительно уменьшается. Но у меня цель, чтобы читатели поняли и закрепили как можно лучше само понятие обработчика.Slavko писал(а): решил немножко укоротить код и уменьшить католичество объектов путем другой настройки обработчика нажатия кнопки.
А, начиная урока с 50-го, я тоже перехожу на onClick.
Re: Урок 19. Пишем простой калькулятор
А можно ли как-то заменить разделитель дробной части - вместо точки на запятую? Так русским людям привычнее...
Re: Урок 19. Пишем простой калькулятор
Как это сделать на уровне системы, я не знаю.Alexgrig писал(а):А можно ли как-то заменить разделитель дробной части - вместо точки на запятую? Так русским людям привычнее...
но можно к EditText добавить такое свойство: android:digits="0123456789.,"
Тогда он разрешит еще и запятую ставить. Ну и в коде потом replace(",", ".") делать, чтобы Float сработал.
Re: Урок 19. Пишем простой калькулятор
Сработало!
Re: Урок 19. Пишем простой калькулятор
Подскажите как избавиться от таких результатов как: 5.3 - 2 = 3.3000002?
PS Спасибо Вам за огромный труд. Всё красиво и доходчиво объясняете.
PS Спасибо Вам за огромный труд. Всё красиво и доходчиво объясняете.
Re: Урок 19. Пишем простой калькулятор
Огромное спасибо, за предоставленные уроки.
У меня вопрос один возник, как реализовать сохранение результата? я сделал так:
в результате после нажатия кнопи Сохранить, у меня в поле tvResult вместо, например 5+5 = 10, появляется 5+5=0, т.е. итоговое значение сбрасывается, подскажите пожалуйста
У меня вопрос один возник, как реализовать сохранение результата? я сделал так:
Код: Выделить всё
private void saveText()
{
SharedPreferences sPref = getPreferences(MODE_PRIVATE);
Editor ed = sPref.edit();
ed.putString(SAVED_TEXT, tvResult.getText().toString());
ed.commit();
Toast.makeText(this, "Результат сохранён", 1000).show();
// TODO Auto-generated method stub
}
Re: Урок 19. Пишем простой калькулятор
Зря я тут Float взял.AndrewGS писал(а):Подскажите как избавиться от таких результатов как: 5.3 - 2 = 3.3000002?
Используйте BigDecimal, проблема должна решиться.
Re: Урок 19. Пишем простой калькулятор
В этом коде содержимое поля tvResult не меняется. Где-то в другом месте ошибка.getsucks писал(а):в результате после нажатия кнопи Сохранить, у меня в поле tvResult вместо, например 5+5 = 10, появляется 5+5=0, т.е. итоговое значение сбрасывается, подскажите пожалуйста
Re: Урок 19. Пишем простой калькулятор
Код: Выделить всё
// читаем EditText и заполняем переменные числами
num1 = Float.parseFloat(etNum1.getText().toString());
num2 = Float.parseFloat(etNum2.getText().toString());
// определяем нажатую кнопку и выполняем соответствующую операцию
Мне не хватало строчки result = Float.valueOf(num1+num2);
Re: Урок 19. Пишем простой калькулятор
а как сделать сложный калькулятор.
например в edittext пишется 340+456-900
жмем enter и получается результат?
например в edittext пишется 340+456-900
жмем enter и получается результат?
Re: Урок 19. Пишем простой калькулятор
Тут только самому парсить строку ("340+456-900"), выделять цифры и операторы, и вычислять результат.top писал(а):а как сделать сложный калькулятор.
например в edittext пишется 340+456-900
жмем enter и получается результат?
Хотя, наверняка уже есть готовые библиотеки, которые это умеют. Можно их поискать.
Re: Урок 19. Пишем простой калькулятор
Заменил float на double. Считать стал более точно. Пришлось еще поменять
num1 = Float.parseFloat(etNum1.getText().toString());
num2 = Float.parseFloat(etNum2.getText().toString());
на
num1 = Double.valueOf(etNum1.getText().toString());
num2 = Double.valueOf(etNum2.getText().toString());
num1 = Float.parseFloat(etNum1.getText().toString());
num2 = Float.parseFloat(etNum2.getText().toString());
на
num1 = Double.valueOf(etNum1.getText().toString());
num2 = Double.valueOf(etNum2.getText().toString());
-
- Сообщения: 12
- Зарегистрирован: 13 июн 2012, 02:29
Re: Урок 19. Пишем простой калькулятор
скорее всего импорт не правильный произвёл, пересмотри импортируемые классы. Кажется должно быть View.OnClickListener , а тебя наверное что то другое импортировано. В общем пересмотри, если не то что то другое =)Eshkin-Kat писал(а):
странно. Из-за чего бы это?
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена