libUTL++
Decimal.h
1 #pragma once
2 
4 
5 #include <libutl/Number.h>
6 
8 
9 UTL_NS_BEGIN;
10 
12 
55 
57 class Decimal : public Object
58 {
60 
61 public:
67  {
68  _n = n;
69  }
70 
75  Decimal(const String& str)
76  {
77  set(str);
78  }
79 
80  virtual void copy(const Object& rhs);
81 
82  virtual int compare(const Object& rhs) const;
83 
84  virtual void serialize(Stream& stream, uint_t io, uint_t mode = ser_default);
85 
86  virtual String toString() const;
87 
93  String toString(uint_t digits, bool round = true) const;
94 
96  Decimal& set(const String& str);
97 
99  Decimal&
100  abs()
101  {
102  if (_n < 0) _n *= -1;
103  return self;
104  }
105 
107  Decimal&
109  {
110  if (_n >= 0)
111  _n -= (_n % 1000000);
112  else
113  _n += (_n % 1000000);
114  return self;
115  }
116 
118 
119  Decimal operator+(const Decimal& rhs) const
120  {
121  return Decimal(_n + rhs._n);
122  }
123 
124  Decimal& operator+=(const Decimal& rhs)
125  {
126  _n += rhs._n;
127  return self;
128  }
129 
130  Decimal operator-(const Decimal& rhs) const
131  {
132  return Decimal(_n - rhs._n);
133  }
134 
135  Decimal& operator-=(const Decimal& rhs)
136  {
137  _n -= rhs._n;
138  return self;
139  }
140 
141  Decimal operator*(const Decimal& rhs) const
142  {
143  Decimal res(_n);
144  res.multiply(rhs._n);
145  return res;
146  }
147 
148  Decimal& operator*=(const Decimal& rhs)
149  {
150  multiply(rhs._n);
151  return self;
152  }
153 
154  Decimal operator/(const Decimal& rhs) const
155  {
156  Decimal res(_n);
157  res.divide(rhs._n);
158  return res;
159  }
160 
161  Decimal& operator/=(const Decimal& rhs)
162  {
163  divide(rhs._n);
164  return self;
165  }
166 
167  Decimal operator%(const Decimal& rhs) const
168  {
169  Decimal res(_n);
170  res.mod(rhs._n);
171  return res;
172  }
173 
174  Decimal& operator++()
175  {
176  _n += 1000000;
177  return self;
178  }
179 
180  Decimal operator++(int)
181  {
182  Decimal res = self;
183  _n += 1000000;
184  return res;
185  }
186 
187  Decimal& operator--()
188  {
189  _n -= 1000000;
190  return self;
191  }
192 
193  Decimal operator--(int)
194  {
195  Decimal res = self;
196  _n -= 1000000;
197  return res;
198  }
200 private:
201  void
202  init()
203  {
204  _n = 0;
205  }
206  void
207  deInit()
208  {
209  }
210 
211  Decimal& multiply(int64_t rhs);
212 
213  Decimal& divide(int64_t rhs);
214 
215  Decimal& mod(int64_t rhs);
216 
217 private:
218  int64_t _n;
219 };
220 
222 
223 UTL_NS_END;
String toString(const FwdIt &begin, const FwdIt &end, const String &sep, bool key=false)
Obtain a string representation of a sequence (via Object::toString()).
void serialize(bool &b, Stream &stream, uint_t io, uint_t mode=ser_default)
Serialize a boolean.
void deInit()
De-initialize UTL++.
default representation (via getSerializeMode())
Definition: util.h:75
Fixed-point decimal number.
Definition: Decimal.h:57
#define UTL_CLASS_DECL(DC, BC)
Declaration of standard UTL++ functionality for a non-template class.
Definition: macros.h:688
Character string.
Definition: String.h:31
long int64_t
Signed 64-bit integer.
Definition: types.h:164
Decimal & abs()
Take the absolute value.
Definition: Decimal.h:100
Decimal(int64_t n)
Constructor.
Definition: Decimal.h:66
void copy(T *dest, const T *src, size_t len)
Copy one array of objects to another.
Definition: util_inl.h:690
unsigned int uint_t
Unsigned integer.
Definition: types.h:59
Stream I/O abstraction.
Definition: Stream.h:68
Decimal(const String &str)
Constructor.
Definition: Decimal.h:75
Decimal & floor()
Remove any fractional component.
Definition: Decimal.h:108
Root of UTL++ class hierarchy.
Definition: Object.h:52
int compare(bool lhs, bool rhs)
Compare two boolean values.
void init()
Initialize UTL++.