Отображение калькулятора Android - усечение ненужных нулей и добавление разделителя для отображения ввода и ответа

Сейчас я работаю над калькулятором Android, и у меня есть некоторые проблемы с отображением результата... отображение теперь настроено с использованием округления string.format до 9 знаков после запятой... но хотя это верно для отображения бесконечных десятичных результатов, многие другие ситуации не нужны, вроде

1+2 должно отображать 3 вместо 3.000000000;

2.03*3 должно отображать 6.09 вместо 6.090000000

  1. как я мог это сделать? попросить программу посмотреть, является ли последняя цифра 0, и если да, то заменить на ""?
  2. как я могу отобразить «,» для каждой тысячи мест? т. е. 123 456 789 вместо одного 123456789 как для ввода, так и для ответа?

ВОЗНИКЛА НОВАЯ ПРОБЛЕМА!!

Я недавно обнаружил, что после объединения с предложениями для манипуляций с маленькими цифрами, такими как до 1000, отображаемый ответ в порядке (например, 999 * 999, вероятно, отображает 998001). Тем не менее, если цифры закончились, отображаемый ответ становится таким, например, 9999 * 9999 = 9,998001e7. Это связано с ограничением двойного числа? если так, то как это можно решить?

исходный код выглядит следующим образом:

    case MULTIPLY:                
        inputnum1 = inputnum.get(0); 
        inputnum2 = inputnum.get(1); 

        inputnum.removeAll(inputnum); 

        inputnum.add(inputnum1 * inputnum2); 

        Display.setText(String.format("%.9f", inputnum.get(0)));  
//
            String str1=Display.getText().toString();
            String stripped1 = Double.valueOf(str1).toString(); 
            Display.setText(stripped1);
//              
            break;

обновленный код выглядит следующим образом:

    private void calculation (int operator) { 

        inputnum.add(Double.parseDouble(Display.getText().toString())); 

        if (operator != EQUALS) {nextOperation = operator;}
        else if (operator == EQUALS){nextOperation = 0;} 

        switch (currentOperation) { 
    case MULTIPLY: 
        inputnum1 = inputnum.get(0); 
        inputnum2 = inputnum.get(1); 

        inputnum.removeAll(inputnum); 

        inputnum.add(inputnum1 * inputnum2); 

        Display.setText(String.format("%.19f", inputnum.get(0)));  

        DecimalFormat myFormatter3 = new DecimalFormat("###,###,###,###,###,###.#########"); 
        String str3=Display.getText().toString(); 
        String stripped3 = Double.valueOf(str3).toString(); 
        stripped3 = myFormatter3.format(Double.valueOf(stripped3)); 
        if (stripped3.endsWith(".0")) 
            stripped3 = stripped3.substring(0, stripped3.length() - 2); 
        Display.setText(stripped3);

аналогично для падежа SUBTRACT: case ADD: case DIVISION:

Большое спасибо!


person pearmak    schedule 27.08.2012    source источник
comment
См. stackoverflow.com/questions/4525854/remove-trailing-zeros.   -  person sdabet    schedule 27.08.2012


Ответы (1)


Запятые легко добавить:

public class DecimalFormatDemo {

static public void customFormat(String pattern, double value ) {
  DecimalFormat myFormatter = new DecimalFormat(pattern);
  String output = myFormatter.format(value);
  System.out.println(value + "  " + pattern + "  " + output);
}

static public void main(String[] args) {

  customFormat("###,###.###", 123456.789);
  customFormat("###.##", 123456.789);
  customFormat("000000.000", 123.78);
  customFormat("$###,###.###", 12345.67);  
}
}

Нули идут так, я считаю:

DecimalFormat myFormatter = new DecimalFormat("###,###,###,###.###");
String str1=Display.getText().toString();
String stripped1 = Double.valueOf(str1).toString();
stripped1 = myFormatter.format(Double.valueOf(stripped1));
if (stripped1.endsWith(".0"))
    stripped1 = stripped1.substring(0, stripped1.length() - 2);
Display.setText(stripped1);
person dragostis    schedule 27.08.2012
comment
Благодарность!! извините за то, что я новичок в разработке Android ... я отредактировал, как указано выше, но 3 + 4 по-прежнему = 7.0 вместо 7 - person pearmak; 27.08.2012
comment
if(Double.valueOf(stripped1) == (int) Double.valueOf(stripped1)) для (int) Double.valueOf(stripped1) он говорит, что не может привести от Double к int... - person pearmak; 27.08.2012
comment
вау... работает!! Спасибо!! Double.valueOf(str1).toString(); это избавиться от лишних 0? - person pearmak; 27.08.2012
comment
как включить вышеуказанный stripped1 вместе с запятыми? - person pearmak; 27.08.2012
comment
извините, но возникает другая проблема... это связано с тем, что inputnum обрабатывается как inputnum.add(Double.parseDouble(Display.getText().toString())); теперь цифры имеют , поэтому, когда сначала 1000 + 2000 и выводится 3000, если далее нажать кнопку «плюс», он выйдет из строя, потому что внутри 3000 есть . Поэтому я добавил новую строку Displaytemp и newDisplaytemp, как указано выше, однако затем он говорит Метод getText() не определен для типа String и поэтому не подходит для замены следующим образом: inputnum.add(Double.parseDouble(newDisplaytemp.getText().toString())); - person pearmak; 27.08.2012
comment
Просто сохраните число (3000) в переменной и отобразите проанализированную строку отдельно, а затем, когда вы захотите добавить снова, вы добавите к той, которую вы сохранили ранее (3000). - person dragostis; 27.08.2012
comment
Да, это ограничение типа Double в Java. Разве все ваши переменные не являются двойными? - person dragostis; 28.08.2012
comment
да они двойные....следующим образом: если то как это можно было бы улучшить? ArrayList‹Double› inputnum = новый ArrayList‹Double›(); двойной входной номер1; двойной ввод2; - person pearmak; 28.08.2012
comment
Тогда это все. Вы не можете сделать их больше. Каждый калькулятор с большим числом покажет 9,9e7, что означает 9,9 * 10 ^ 7. Если вы чувствуете, что не можете жить с этим ограничением, я предлагаю вам переделать свой калькулятор и использовать Strings вместо Double. Проблема в том, что вам придется переопределять каждую операцию; другими словами, вам придется научить ЦП выполнять базовые вычисления, вычитание и т. д. - person dragostis; 28.08.2012
comment
это звучит хлопотно... калькулятор сделать гораздо сложнее, чем я ожидал... так как он будет отличаться, если изменить переменную на плавающую, а не на двойную? - person pearmak; 28.08.2012
comment
Было бы еще хуже. Тем не менее, вы можете сделать это лучше, сохранив целочисленное значение двойного числа в int, оставив только то, что находится после запятой в двойном значении. Затем, когда вы хотите отобразить его, объедините строку из int со строкой из double. - person dragostis; 28.08.2012
comment
на самом деле просто хотелось бы знать, как это работает на самом деле... некоторые даже могут строить графики с множеством функций... есть ли какие-нибудь хорошие примеры, которыми можно поделиться? я нашел это на sourceforge.net/projects/androidcalculat, но не знаю, как его открыть gz... в любом случае большое спасибо за помощь! - person pearmak; 28.08.2012
comment
Это tar-файл для Linux. Погугли это. - person dragostis; 28.08.2012
comment
как может быть обработано округление, например, 4000,84 - 4000, выводящее как 0,840000000000146 вместо 0,84? - person pearmak; 30.08.2012