First checkin, AXE release 0.2
[AXE.git] / src / amount.cpp
1 /**************************************************************************
2 **  (c) Copyright 1999, Andromeda Technology & Automation
3 ***************************************************************************
4 ** MODULE INFORMATION *
5 ***********************
6 **      FILE NAME      : amount.cpp
7 **      SYSTEM NAME    : Andromeda X-Windows Encapsulation
8 **      VERSION NUMBER : $Revision: 1.1 $
9 **
10 **  DESCRIPTION      :  Financial classes : amount
11 **
12 **  EXPORTED OBJECTS : class amount
13 **  LOCAL    OBJECTS : 
14 **  MODULES  USED    :
15 ***************************************************************************
16 **  ADMINISTRATIVE INFORMATION *
17 ********************************
18 **      ORIGINAL AUTHOR : Arjen Baart - arjen@andromeda.nl
19 **      CREATION DATE   : Aug 26, 1999
20 **      LAST UPDATE     : Aug 26, 1999
21 **      MODIFICATIONS   : 
22 **************************************************************************/
23
24 /*****************************
25    $Log: amount.cpp,v $
26    Revision 1.1  2002-07-25 08:01:26  arjen
27    First checkin, AXE release 0.2
28
29 *****************************/
30
31 static const char RCSID[] = "$Id: amount.cpp,v 1.1 2002-07-25 08:01:26 arjen Exp $";
32
33 #include "money.h"
34
35 istream &operator>>(istream &s, amount &a)
36 {
37    long   hundreds;
38    char   c;
39
40    s >> hundreds >> c >> a.value;
41    a.value += hundreds * 100;
42
43    return s;
44 }
45
46 ostream &operator<<(ostream &s, amount a)
47 {
48    if (a == 0)
49    {
50       s << "           ";
51    }
52    else
53    {
54       s.width(8);
55       s.fill(' ');
56       s << a / 100;
57       s << '.';
58       s.width(2);
59       s.fill('0');
60       s << a % 100;
61       //s << form("%8d.%02d",a / 100, a % 100);
62    }
63
64    return s;
65 }
66
67 amount::amount(String s)
68 {
69    int  dp;   // The position of the decimal point
70
71    dp = s.index('.');
72    if (dp == -1)
73    {
74       dp = s.index(',');
75    }
76    if (dp != -1)
77    {
78       String  whole;
79
80       whole = s(0, dp);
81       value = whole;
82       value *= 100;
83       s <<= dp + 1;
84       value += (unsigned long)s;
85    }
86    else
87    {
88       //  No decimal point; integer value
89
90       value = s;
91       value *= 100;
92    }
93 }
94
95 amount::operator String()
96 {
97    String s;
98
99    s = String(value / 100) + "." + String(value % 100);
100
101    return s;
102 }
103
104 String amount::make_string(void)
105 {
106    String s;
107    String decimals;
108
109    s = String(value / 100) + ".";
110    decimals = String(value % 100);
111    if (~decimals == 1)
112    {
113       decimals = "0" + decimals;
114    }
115
116    s += decimals;
117
118    return s;
119 }
120
121