【问题标题】:How to set 2 decimal places in sqlite select statement如何在sqlite select语句中设置2个小数位
【发布时间】:2011-09-14 13:47:09
【问题描述】:

我有一个 sqlite 表,其中包含带有 NUMERIC(10,5) 值的金额字段(我知道数据类型在 sqlite 中意义不大)。我想编写一个以 2 位小数显示金额的选择语句。

    id      name             type        notnull      dflt_value      pk   
------- --------------- ---------- ----------- -------------- --- 
0        _id              integer       0                            1    
1        name             varchar       1                            0    
2        amount           NUMERIC(10,5) 0                            0    

SELECT _id, name, amount FROM accounts

是否可以在选择语句中将金额转换为两位小数,以便我可以在应用程序中显示两位小数。 我需要在select语句中格式化,不想改变表结构。提前致谢。

我正在使用以下代码来填充 android 中的列表视图

    cursor = dbAdapter.getAccountsTotals(); 
    startManagingCursor(cursor); 
    String[] from = new String[] { DbAdapter.KEY_ID, DbAdapter.KEY_NAME, DbAdapter.KEY_AMOUNT}; 
    int[] to = new int[] { R.id.dis1, R.id.dis2, R.id.dis3}; 
    SimpleCursorAdapter trans = new SimpleCursorAdapter(this, R.layout.accts_row, cursor, from, to); 
setListAdapter(trans); 

所以在从数据库中提取后无法格式化结果。请让我知道有一种方法可以在上面的代码中分配格式化值,谢谢。

【问题讨论】:

  • 看到这个here
  • Here 在将值插入表格时设置小数点后两位。
  • 请不要尝试在数据层做展示的事情(比如格式化)。尝试分离关注点:从数据库中获取您的“数据”(不是以某种精度表示数字的文本字符串),然后在您的 UI 代码(页面/窗口/报告/等)中显示格式化的“字符串”。正如@Kennet 所说。

标签: java android sqlite


【解决方案1】:
SELECT _id, name, ROUND(amount,2) FROM accounts

下面的代码会让你知道如何做到这一点

公共类 TestListView 扩展 ListActivity { ... private DecimalFormat myCustDecFormatter = new DecimalFormat("########.00"); ... ... /** 在第一次创建活动时调用。 */ @覆盖 公共无效 onCreate(Bundle savedInstanceState) { ... ... ... } 私人无效填充数据(){ /* 从数据库中获取所有行并创建项目列表 */ /* 对于多账户,传入账户名称? */ mEntryCursor = mDbHelper.fetchAllEntries(); 开始管理光标(mEntryCursor); // 创建一个数组来指定我们要在列表中显示的字段(仅 TITLE) String[] from = new String[]{myDbAdapter.KEY_NMBR,myDbAdapter.KEY_DATE,myDbAdapter.KEY_DESCR,myDbAdapter.KEY_AMT}; // 以及我们希望将这些字段绑定到的字段数组(在本例中为 text1) int[] to = new int[]{R.id.txtnmbr, R.id.txtdate, R.id.txtdescr, R.id.txtamt}; // 现在创建一个简单的光标适配器并将其设置为显示 setListAdapter(new SimpleCursorAdapter(this, R.layout.entryrow, mEntryCursor, from, to) { @覆盖 公共无效 setViewText(TextView v,字符串文本){ super.setViewText(v, convText(v, text)); } }); } 私人字符串convText(TextView v,字符串文本){ 开关 (v.getId()) { 案例 R.id.txtamt: 双 dblAmt; //dblAmt = Double.valueOf(text); dblAmt = mEntryCursor.getDouble(AMT_COLUMN); 返回 myCustDecFormatter.format(dblAmt); } 返回文本; } }//结束TestListView

【讨论】:

  • +1 表示查询;但我认为最好在表示层中格式化数字。
  • 感谢您的回答,但我需要保留两位小数。不只是四舍五入到小数点后两位。例如 123.40 或 56.00 在 android 应用程序中将其显示为货币价值。顺便说一句,金额值是一种 NUMERIC(10,5) 而不是浮点数(我的错误)
  • 我使用以下代码填充 android cursor = dbAdapter.getAccountsTotals(); 中的列表视图开始管理光标(光标); String[] from = new String[] { DbAdapter.KEY_ID, DbAdapter.KEY_NAME, DbAdapter.KEY_AMOUNT}; int[] to = new int[] { R.id.dis1, R.id.dis2, R.id.dis3}; SimpleCursorAdapter trans = new SimpleCursorAdapter(this, R.layout.accts_row, cursor, from, to); setListAdapter(trans);所以无法格式化结果。请让我知道有一种方法可以将格式化的值分配给上述代码,谢谢。
  • 感谢它现在正在工作。 dblAmt = mEntryCursor.getDouble(AMT_COLUMN);我必须制作 AMT_COLUMN 整数。然后它就开始工作了。
【解决方案2】:

在数据库中保留浮点值,在表示层中保留格式,如下所示:

 float f = 1.23456f;
    NumberFormat instance = NumberFormat.getInstance();
    instance.setMaximumFractionDigits(2);
    System.out.println(instance.format(f));

【讨论】:

  • 我不同意。这种格式的合理位置是在数据库视图中。这种方法是 DRYer。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多