в моем приложении я показываю числовые строки и заметил, что "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();
}
});
formatter выглядит следующим образом:
DecimalFormat formatter = new DecimalFormat("##################################################################################.################################");
Изменение: как ни странно, "0,33333333" отображается неправильно, но когда * добавляется, он делает, однако, когда * вычитается из него снова, это не так. Как всегда, помощь приветствуется.
То, что я закончил, было просто добавлением пробела в начало строки, и это сработало.
Это так интересно, потому что очевидный, double
а не BigDecimal
, не тот случай. Вы упомянули базу данных. Возможно, вы перезагрузите поле из базы данных, а поле записи - DOUBLE
а не DECIMAL
или DECIMAL
с неправильной точностью.
Редактировать:
Да. Ну, проблема, похоже, не в объекте formatter
. Он возвращает Double
если не setParseBigDecimal(true)
, но вы получите ошибку приведения, если попытаетесь setParseBigDecimal(true)
Double
to 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)