2015-12-10 107 views
0

我有從數據庫填充ListView的這種方法。一切正常。但是我想讓其中一個文本框顯示兩位小數的值。Android從數據庫填充ListView,格式textview有兩位小數

這種情況以前也有人問,很多標記是重複的,但問題是我怎麼能實現兩個小數和我在哪裏做以下

代碼正如你所看到的,我嘗試了很多不同的東西沒有成功。也許我需要建立一個自定義適配器,我設置我的TextViews?

而且因爲答案不是等在這裏給出的請不要將此標記爲重複:

Best way to Format a Double value to 2 Decimal places

或在這裏:

Round a double to 2 decimal places

或在這裏:

How to round a number to n decimal places in Java

這裏是我的代碼和我的問題是我可以在哪裏實現我的代碼四捨五入至兩位小數?

private void populateListViewFromDB(int month, int year) { 


    Cursor cursor = dbHandler.getMonth(month,year); 

    // TextView setEx = (TextView)findViewById(R.id.oneRowExkl); 
    // set = Double.parseDouble(setEx.getText().toString()); 
    // setEx.setText(String.format("%.2f", set)); 
    //TextView ex = (TextView)findViewById(R.id.oneRowExkl); 
    //ex.setText(String.format("%.2f", Double.parseDouble(MyDBHandler.INKL))); 


    String[] fromFieldNames = new String[] { 
      MyDBHandler.COLUMN_PRODUCTNAME, MyDBHandler.DATE, 
      MyDBHandler.INKL }; 
    int[] toViewIDs = new int[] { R.id.oneRowName, R.id.oneRowDate, 
      R.id.oneRowExkl }; 

    // Create adapter to may columns of the DB onto element in the UI. 
    @SuppressWarnings("deprecation") 
    SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(this, // 
    Context 
      R.layout.one_row, // Row layout template 
      cursor, // cursor (set of DB records to map) 
      fromFieldNames, // DB Column names 
      toViewIDs // View IDs to put information in 
    ); 

    ListView myList = (ListView) findViewById(R.id.list1); 
    // myList.setBackgroundColor(Color.GRAY); 
    myList.setAdapter(myCursorAdapter); 
} 

回答

0

首先,數據庫中的數據類型是什麼?它是否設置爲處理小數/在DB中存儲?你能改變數據庫端的舍入規則嗎?

如果不是,則要在代碼中實施捨入。由於您在示例中使用了SimpleCursorAdapter,因此它使用convertToString(光標)將數據輸出到您的視圖。

你可以做的是給它一個自定義的字符串轉換器,你可以爲指定的列創建舍入。

例如:

CursorToStringConverter myConverter = new CursorToStringConverter() { 

@Override 
public CharSequence convertToString(Cursor cursor) { 
    int myColumn = [whatever column id]; 
    String s = cursor.getString(myColumn); //Or .getFloat() for instance 
    return [whatever rounding you want, or truncating, or such] 
} 
}; 

然後將其設置你的適配器上:

myAdapter.setCursorToStringConverter(myConverter); 

你也可以嘗試給適配器一個新的ViewBinder,在您檢查所需的列,當它是即將綁定之前,請在綁定之前手動編輯輸出,如下所示(在將適配器分配給視圖之前粘貼此內容):

myAdapter.setViewBinder(new ViewBinder() { 
@Override 
public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 

    if (columnIndex == 3) { 
      //If it is actually stored as float number in db, do 
      //cursor.getFloat(columnIndex) instead 
      String formatStr = cursor.getString(columnIndex); 
      TextView textView = (TextView) view; 

      //Here, do your truncating 
      [insert whatever code to either truncate string or format float] 

      textView.setText(fixedStr); 
      return true; 
    } 

    return false; 
} 
}); 

要只看到它是如何工作的,做你的截斷或格式,它說:前[插入...]剛纔設置:

String fixedStr = "Random string"; 

,你可能會看到它做什麼。

+0

這看起來像一個很好的解決方案的代碼,但是新手,因爲我沒得到它的工作。 –

+0

請參閱我的編輯以獲取更多選項...請注意,您需要知道它在db(數據類型)中的含義,因此如果存儲爲如此,則可以調用cursor.getFloat();如果存儲爲VARCHAR,則可以調用getString()然後,您只需以您喜歡的方式轉換數據(格式爲兩位小數)。 columnIndex是遊標的活動列,因此將此數字更改爲您需要的數字(您需要格式化) –

+0

好吧,我會盡力處理這個問題。我將它們中的兩個存儲爲字符串,另一個我需要格式化爲真實的 –

0

只是爲了說明問題是如何與@Richar Erikssons代碼解決了,下面是解決我的問題

myCursorAdapter.setViewBinder(new ViewBinder() { 
     @Override 
     public boolean setViewValue(View view, Cursor cursor, int 
     columnIndex) { 
      if (columnIndex == 3) { 


        TextView textView = (TextView) view; 


        String fixedStr = String.valueOf(String.format("%.2f", 
        cursor.getDouble(columnIndex))); 

        textView.setText(fixedStr); 
        return true; 
       } 

       return false; 
      } 
     }); 
相關問題