Money.java 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package org.leumasjaffe.charsheet.model.inventory;
  2. import lombok.AccessLevel;
  3. import lombok.AllArgsConstructor;
  4. import lombok.Data;
  5. import lombok.experimental.FieldDefaults;
  6. @AllArgsConstructor
  7. @Data
  8. @FieldDefaults(level=AccessLevel.PRIVATE)
  9. public class Money implements Comparable<Money> {
  10. int pp, gp, sp, cp;
  11. Money sum( final Money other ) {
  12. return new Money(pp + other.pp, gp + other.gp, sp + other.sp, cp + other.cp);
  13. }
  14. Money subtract( final Money other ) {
  15. final Money tmp = new Money(pp + other.pp, gp + other.gp, sp + other.sp, cp + other.cp);
  16. tmp.rebalance( );
  17. return tmp;
  18. }
  19. private void rebalance( ) {
  20. if ( pp < 0 ) { gp += 10 * pp; pp = 0; }
  21. if ( gp < 0 ) { sp += 10 * gp; gp = 0; }
  22. if ( sp < 0 ) { cp += 10 * sp; sp = 0; }
  23. if ( cp < 0 ) { int tmp = (int) Math.ceil( cp / 10.0 ); sp -= tmp; cp += 10 * tmp; }
  24. if ( sp < 0 ) { int tmp = (int) Math.ceil( sp / 10.0 ); gp -= tmp; sp += 10 * tmp; }
  25. if ( gp < 0 ) { int tmp = (int) Math.ceil( gp / 10.0 ); pp -= tmp; gp += 10 * tmp; }
  26. }
  27. public String toString() {
  28. final StringBuilder str = new StringBuilder();
  29. if ( pp > 0 ) { str.append(pp).append("pp "); }
  30. if ( gp > 0 ) { str.append(gp).append("gp "); }
  31. if ( sp > 0 ) { str.append(sp).append("sp "); }
  32. if ( cp > 0 ) { str.append(cp).append("cp "); }
  33. return str.toString();
  34. }
  35. @Override
  36. public int compareTo(Money o) {
  37. return Integer.compare(asCopper(), o.asCopper());
  38. }
  39. public static Money fromCopper(int cp) {
  40. final int pp = cp / 1000; cp -= pp * 1000;
  41. final int gp = cp / 100; cp -= gp * 100;
  42. final int sp = cp / 10; cp -= sp * 10;
  43. return new Money(pp, gp, sp, cp);
  44. }
  45. public int asCopper() {
  46. return cp + sp * 10 + gp * 100 + pp * 1000;
  47. }
  48. }