/* * Simple "US money" type -- definitions of functions declared in * simple-us-money.h. */ #include "simple-us-money.h" #include #include #include #include /* helper functions */ static long money_to_cents(us_money_t m); static us_money_t cents_to_money(long n); /* functions defined in .h */ void print_money(FILE * f, us_money_t m) { if (m.is_negative) { fputc('-', f); } fputc('$', f); fprintf(f, "%ld.%02d", m.dollars, m.cents); } bool input_money(FILE * f, us_money_t *m) { long dollars; int cents; char ch; if (fscanf(f, "%ld.%d%c", &dollars, ¢s, &ch) == 3) { ungetc(ch, f); if (!isspace(ch)) { return false; } if ((cents < 0) || (cents > 99)) { return false; } m->is_negative = (dollars < 0); m->dollars = labs(dollars); m->cents = cents; return true; } return false; } us_money_t add_money(us_money_t m1, us_money_t m2) { long n1 = money_to_cents(m1); long n2 = money_to_cents(m2); return cents_to_money(n1 + n2); } us_money_t subtract_money(us_money_t m1, us_money_t m2) { long n1 = money_to_cents(m1); long n2 = money_to_cents(m2); return cents_to_money(n1 - n2); } us_money_t multiply_money(us_money_t m1, double d) { long n1 = money_to_cents(m1); return cents_to_money(round(n1 * d)); } static long money_to_cents(us_money_t m) { long n = m.dollars*100 + m.cents; if (m.is_negative) return -n; else return n; } static us_money_t cents_to_money(long n) { us_money_t tempm = { (n < 0) ? true : false, labs(n) / 100, labs(n) % 100 }; return tempm; }