我有一个Sqlitedb,其中包含一列:amount text not null
在列数中,我以这种格式存储美元值:$ 1.01,$ 40.58等。
我正在尝试使用
来总结美元价值SELECT SUM(amount) FROM record WHERE date LIKE '"+date+"'"
然而,它不起作用,大概是因为你无法添加文字。我知道这不是理想的存储空间,但我如何解析数量以便我可以添加它们?
答案 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);