Как я должен остановить строки, которые числа округляются при отображении? - PullRequest
1 голос
/ 02 марта 2012

в моем приложении я отображаю числовые строки и заметил, что «7.000444» отображается как «7.00044». Кроме того, «0,567567» отображается как «0,56757». Наконец, добавление любой нецифровой части (то есть буквы) заставляет их отображаться с полным номером, за которым следует другая клавиша. Есть ли способ остановить поведение первых двух? Я показываю их, добавляя это в базу данных, которая затем отображается в ListView. Код для создания строки представляет собой набор кнопок, для кнопок 0-9 это:

Button one;
one = (Button)findViewById(R.id.one);
one.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            working = BigDecimal.valueOf(1);
            now = working.toString();
            total1 = total.concat(now);
            equation1 = equation.concat(now);
            equation = equation1;
            total = total1;
            if(b){mnDbHelper.updateNote(equation, mnDbHelper.testCount());}
            else{mnDbHelper.createNote(equation);
            b=true;}
            fillData();
        }
});

При необходимости 1 изменяется. Кнопка десятичной точки имеет следующий вид:

Button decimal;
decimal = (Button)findViewById(R.id.decimal);
decimal.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            now = ".";
            equation1 = equation.concat(now);
            total1 = total.concat(now);
            equation = equation1;
            total = total1;
            if(b){mnDbHelper.updateNote(equation, mnDbHelper.testCount());}
            else{mnDbHelper.createNote(equation);
            b=true;}
            fillData();
        }

});

Вот код для FillData:

private void fillData() {
    // Get all of the notes from the database and create the item list
    Cursor c = mnDbHelper.fetchAllNotes();

    startManagingCursor(c);

   String[] columns = new String[] {EquationsDbAdapter.KEY_VALUE};

   int to[] = new int[] {android.R.id.text1};

   SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_1 ,c , columns , to);

   setListAdapter(adapter);

}

Вот пример кода для одной из других кнопок:

  Button times;
        times = (Button)findViewById(R.id.times);
        times.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                now = "*";
                equation1 = equation.concat(now);r = equation;
                equation = equation1;z = equation;
                if(total!="")
                {try{
                    formatter.parse(total);
                }
                catch(Throwable t){
                    really = false;
                }
                if(really){
                    try {
                        mDbHelper.createNote((BigDecimal) formatter.parse(total), fa, fa, fa, fa, fa, fa, jkl, fa, fa);
                    } catch (ParseException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                total = "";
                total1 = "";}
                else{really = true;}}
                mDbHelper.createNote(jkl, fa, fa, t, fa, fa, fa, jkl, fa, fa);
                if(b){mnDbHelper.updateNote(equation, mnDbHelper.testCount());}
                else{mnDbHelper.createNote(equation);
                b=true;}
                fillData();
            }
    });
Форматер

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

 DecimalFormat formatter = new DecimalFormat("##################################################################################.################################");

Редактировать: как ни странно, отображаемое «0.33333333» не отображается правильно, но при добавлении * оно отображается, однако, когда * вычитается из него снова, оно не отображается Как всегда, помощь очень ценится.

Ответы [ 3 ]

1 голос
/ 02 марта 2012

Это так интересно, потому что очевидное, double вместо BigDecimal, не так. Вы упомянули базу данных. Возможно, вы перезагрузите поле из базы данных, и поле записи будет DOUBLE, а не DECIMAL или DECIMAL с неправильной точностью .

1 голос
/ 02 марта 2012

Изменить:

Ха. Ну, похоже, проблема не в объекте formatter. Он возвращает Double, если не был вызван setParseBigDecimal(true), но вы получите ошибку приведения, если попытаетесь привести Double к BigDecimal. Я не думаю, что вам нужен форматировщик и должен вызывать следующее, но я не вижу, где это вызывает усечение:

new BigDecimal(total)

Есть подозрение, что где-то вы переходите от String к double или float, что урезает точность BigDecimal. Например, вы уверены, что не делаете:

working = BigDecimal.valueOf((double)value);

Убедитесь, что вы используете String конструктор для BigDecimal:

working = new BigDecimal(valueStr);

Выполняется посимвольная обработка строки для создания BigDecimal без потери точности.

Если вы предоставите больше деталей (как просили многие комментарии) и покажете код, который фактически создает BigDecimal, тогда я отредактирую свой ответ, чтобы предоставить больше информации.


код:

if(total!="")

не правильно. Вы редко хотите сравнивать строки с == или !=. Я подозреваю, что должно быть:

if (!("".equals(total)))

или, может быть

if (total.length() > 0)
0 голосов
/ 27 марта 2012

В итоге я просто добавил пробел в начало строки, и это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...