Using Realm.io to store money values

Emanuele from Realm here.

You are right, using floats or doubles for currency is a bad idea.

We don't support BigDecimal for now, and before we do we will have to see how that plays in relation to all other language bindings since we want realm files to be compatible across all the supported platforms.

Christian's idea is good, but I see the conversion to and from String to be a bit slow. If you don't need the arbitrary precision property of BigDecimal you could use long and multiply/divide by the factor your required precision calls for. This would also save a lot of space in terms of the size of the Realm file since integer values are bit packed.


That could work, but would probably be suboptimal if do calculations on your current BigDecimal objects.

You could also use the @Ignore annotation to provide a wrapper method for your custom objects like this:

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());
  }
}

It is not perfect as you need to expose the *dbValue() methods, but it should work.

I would also suggest going to https://github.com/realm/realm-java/issues and make a feature request for this as BigDecimal is probably one of those java classes used by so many that it could warrant native Realm support, just like Date has.