我開始在Realm.io中玩我正在寫的Android應用程序。在我的一個數據對象中,我需要存儲一個貨幣值。以前,我在內部將該值存儲爲BigDecimal值,然後在移入和移出數據庫時將其轉換爲雙值。使用Realm.io存儲貨幣值
我總是被告知,由於處理方式而將貨幣值存儲在double中是一個壞主意。不幸的是,Realm.io不支持存儲和檢索BigDecimal對象。
是編寫自己的貨幣類的最佳解決方案,該類可以擴展RealmObject並將其作爲數據對象的成員變量保留下來?
我開始在Realm.io中玩我正在寫的Android應用程序。在我的一個數據對象中,我需要存儲一個貨幣值。以前,我在內部將該值存儲爲BigDecimal值,然後在移入和移出數據庫時將其轉換爲雙值。使用Realm.io存儲貨幣值
我總是被告知,由於處理方式而將貨幣值存儲在double中是一個壞主意。不幸的是,Realm.io不支持存儲和檢索BigDecimal對象。
是編寫自己的貨幣類的最佳解決方案,該類可以擴展RealmObject並將其作爲數據對象的成員變量保留下來?
Emanuele from Realm here。
你是對的,使用花車或雙打貨幣是一個不好的想法。
我們現在不支持BigDecimal,在這之前我們必須看看它如何與所有其他語言綁定相關,因爲我們希望領域文件在所有支持的平臺上都兼容。
Christian的想法很好,但是我看到String和String之間的轉換有點慢。如果您不需要BigDecimal的任意精度屬性,則可以使用long
並乘以/除以所需精度要求的因子。根據Realm文件的大小,這也可以節省很多空間,因爲整數值是打包的。
這可能會奏效,但如果對當前的BigDecimal對象進行計算可能不是最理想的。
你也可以使用@Ignore標註爲你這樣的自定義對象提供的包裝方法:
public class Money extends RealmObject {
private String dbValue;
@Ignore private BigDecimal value;
public String getDbValue() {
return dbValue;
}
public void setDbValue(String dbValue) {
this.dbValue = dbValue;
}
public BigDecimal getValue() {
return new BigDecimal(getDbValue());
}
public void setValue(BigDecimal value) {
setDbValue(value.toString());
}
}
,因爲你需要暴露* dbValue()方法,它不是完美的,但它應該工作。
我也建議去https://github.com/realm/realm-java/issues併爲此做一個功能請求,因爲BigDecimal可能是那麼多的java類中的一個,它可以保證本地Realm支持,就像Date一樣。
我做的是存儲它只要
我在我的應用程序定義的常量,像這樣:
public static final BigDecimal MONEY_PRECISION = new BigDecimal(1000);
,當我需要存儲大小數它是這樣的:
public class MoneyClass extends RealmObject {
long _price = 0;
public void set_price(BigDecimal price) {
this._price = price.longValue() * App.MONEY_PRECISION.longValue();
}
public BigDecimal get_price() {
return new BigDecimal(_price).divide(App.MONEY_PRECISION, 0, 0);
}
}
從理論上講,這應該是比它保存在串快,但我還沒有真正望着領域代碼更
也xamarin開發人員需要小數! – user2912553 2017-07-07 15:02:08