Sqlite将文本转换为十进制?

时间:2011-03-02 17:25:29

标签: java android sql

我有一个Sqlitedb,其中包含一列:amount text not null

在列数中,我以这种格式存储美元值:$ 1.01,$ 40.58等。

我正在尝试使用

来总结美元价值
SELECT SUM(amount) FROM record WHERE date LIKE '"+date+"'"

然而,它不起作用,大概是因为你无法添加文字。我知道这不是理想的存储空间,但我如何解析数量以便我可以添加它们?

2 个答案:

答案 0 :(得分:2)

好吧,正如你所说,这远远不是存储值的理想方式(从一开始就应该是decimal / real格式),但你可以这样做:

SELECT SUM(SUBSTR(amount, 2)) FROM record WHERE date LIKE '"+date+"'"

SUBSTR方法是一个文本函数,它将采用文本的一部分(在本例中,来自起始索引)。这里的问题是$符号,它将动态类型转换混淆为相信你试图将字符串组合在一起。

现在应该可以使用SQLLite允许dynamic typing(简而言之,意味着该值用于比较,而不是容器)。

答案 1 :(得分:1)

最好将金额存储为未缩放的整数,并在需要显示时格式化它们。您可以获得更紧凑的存储,更轻松,更快速的添加。使用整数可以避免在浮点表示中舍入错误的风险。

通过未缩放,我的意思是$ 1.23将存储为整数123.(在Java代码中使用long,在SQL中使用INTEGER。)

您可以通过查询相关信息的区域设置来格式化显示金额:

// implement this any way you like!
long         amount   = getAmountFromDb();    

// use default locale if you want
Locale       locale       = getLocaleFromSomewhere();                 
Currency     currency     = Currency.getInstance(locale);
NumberFormat format       = NumberFormat.getCurrencyInstance(locale);
int          scale        = currency.getDefaultFractionDigits();

BigDecimal   scaledAmount = new BigDecimal(unscaledBalance).movePointLeft(scale);
String       textAmount   = format.format(scaledAmount);