| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- package org.leumasjaffe.charsheet.model.inventory;
- import lombok.AccessLevel;
- import lombok.AllArgsConstructor;
- import lombok.Data;
- import lombok.experimental.FieldDefaults;
- @AllArgsConstructor
- @Data
- @FieldDefaults(level=AccessLevel.PRIVATE)
- public class Money implements Comparable<Money> {
- int pp, gp, sp, cp;
-
- Money sum( final Money other ) {
- return new Money(pp + other.pp, gp + other.gp, sp + other.sp, cp + other.cp);
- }
-
- Money subtract( final Money other ) {
- final Money tmp = new Money(pp + other.pp, gp + other.gp, sp + other.sp, cp + other.cp);
- tmp.rebalance( );
- return tmp;
- }
-
- private void rebalance( ) {
- if ( pp < 0 ) { gp += 10 * pp; pp = 0; }
- if ( gp < 0 ) { sp += 10 * gp; gp = 0; }
- if ( sp < 0 ) { cp += 10 * sp; sp = 0; }
- if ( cp < 0 ) { int tmp = (int) Math.ceil( cp / 10.0 ); sp -= tmp; cp += 10 * tmp; }
- if ( sp < 0 ) { int tmp = (int) Math.ceil( sp / 10.0 ); gp -= tmp; sp += 10 * tmp; }
- if ( gp < 0 ) { int tmp = (int) Math.ceil( gp / 10.0 ); pp -= tmp; gp += 10 * tmp; }
- }
-
- public String toString() {
- final StringBuilder str = new StringBuilder();
- if ( pp > 0 ) { str.append(pp).append("pp "); }
- if ( gp > 0 ) { str.append(gp).append("gp "); }
- if ( sp > 0 ) { str.append(sp).append("sp "); }
- if ( cp > 0 ) { str.append(cp).append("cp "); }
- return str.toString();
- }
- @Override
- public int compareTo(Money o) {
- return Integer.compare(asCopper(), o.asCopper());
- }
-
- public static Money fromCopper(int cp) {
- final int pp = cp / 1000; cp -= pp * 1000;
- final int gp = cp / 100; cp -= gp * 100;
- final int sp = cp / 10; cp -= sp * 10;
- return new Money(pp, gp, sp, cp);
- }
- public int asCopper() {
- return cp + sp * 10 + gp * 100 + pp * 1000;
- }
- }
|