表格线识别通用库文档
载入中...
搜索中...
未找到
percent.hpp
浏览该文件的文档.
1/*
2 * @Description: 百分比 头文件及其实现
3 * @Version:
4 * @Autor: dreamy-xay
5 * @date: 2024-1-27
6 * @LastEditors: dreamy-xay
7 * @LastEditTime: 2024-03-06
8 */
9
10#ifndef COMMON_PERCENT_HPP
11#define COMMON_PERCENT_HPP
12
13#include <string>
14
15#include "common/enum.h"
16#include "common/macro.h"
17#include "common/type.h"
19
20namespace cm {
21
35class Percent {
36 private:
37 double value;
38 bool is_percent; // 是否百分比
39
40 public:
41 Percent();
42 Percent(double value, bool is_percent = true);
43 Percent(int value, bool is_percent = false);
44 Percent(const Percent& percent);
45 ~Percent();
46
47 friend std::ostream& operator<<(std::ostream& out, const Percent& percent);
48
49 template <typename T>
50 T operator+(const T& value) const;
51 template <typename T>
52 T operator-(const T& value) const;
53 template <typename T>
54 T operator*(const T& value) const;
55 template <typename T>
56 T operator/(const T& value) const;
57
58 template <typename T>
59 T& AddPercent(T& value) const;
60 template <typename T>
61 T& SubtractPercent(T& value) const;
62 template <typename T>
63 T& MultiplyPercent(T& value) const;
64 template <typename T>
65 T& DividePercent(T& value) const;
66
67 template <typename T>
68 friend T operator+(const T& value, const Percent& percent);
69 template <typename T>
70 friend T operator-(const T& value, const Percent& percent);
71 template <typename T>
72 friend T operator*(const T& value, const Percent& percent);
73 template <typename T>
74 friend T operator/(const T& value, const Percent& percent);
75
76 template <typename T = double>
77 T Value() const;
78 Percent& Assign(double value, bool is_percent = true);
79 Percent& Assign(int value, bool is_percent = false);
80 std::string Percentage(uint precision = 2) const;
81 bool IsPercent() const;
82};
83
91inline Percent::Percent() : value{}, is_percent(true) {}
92
103inline Percent::Percent(double value, bool is_percent) : value(value), is_percent(is_percent) {}
104
115inline Percent::Percent(int value, bool is_percent) : value(value), is_percent(is_percent) {}
116
126inline Percent::Percent(const Percent& percent) : value(percent.value), is_percent(percent.is_percent) {}
127
136
149inline std::ostream& operator<<(std::ostream& out, const Percent& percent) {
150 out << percent.Percentage();
151
152 return out;
153}
154
168template <typename T>
169inline T Percent::operator+(const T& value) const {
170 if (is_percent)
171 return this->value + value;
172 return this->value;
173}
174
188template <typename T>
189inline T Percent::operator-(const T& value) const {
190 if (is_percent)
191 return this->value - value;
192 return this->value;
193}
194
208template <typename T>
209inline T Percent::operator*(const T& value) const {
210 if (is_percent)
211 return this->value * value;
212 return this->value;
213}
214
228template <typename T>
229inline T Percent::operator/(const T& value) const {
230 if (is_percent)
231 return this->value / value;
232 return this->value;
233}
234
248template <typename T>
249inline T& Percent::AddPercent(T& value) const {
250 if (is_percent)
251 value += this->value;
252 return value;
253}
254
268template <typename T>
269inline T& Percent::SubtractPercent(T& value) const {
270 if (is_percent)
271 value -= this->value;
272 return value;
273}
274
288template <typename T>
289inline T& Percent::MultiplyPercent(T& value) const {
290 if (is_percent)
291 value *= this->value;
292 return value;
293}
294
308template <typename T>
309inline T& Percent::DividePercent(T& value) const {
310 if (is_percent)
311 value /= this->value;
312 return value;
313}
314
329template <typename T>
330inline T operator+(const T& value, const Percent& percent) {
331 if (percent.is_percent)
332 return value + percent.value;
333 return percent.value;
334}
335
350template <typename T>
351inline T operator-(const T& value, const Percent& percent) {
352 if (percent.is_percent)
353 return value - percent.value;
354 return percent.value;
355}
356
371template <typename T>
372inline T operator*(const T& value, const Percent& percent) {
373 if (percent.is_percent)
374 return value * percent.value;
375 return percent.value;
376}
377
392template <typename T>
393inline T operator/(const T& value, const Percent& percent) {
394 if (percent.is_percent)
395 return value / percent.value;
396 return percent.value;
397}
398
410template <typename T>
411inline T Percent::Value() const {
412 return value;
413}
414
426inline std::string Percent::Percentage(uint precision) const {
427 if (is_percent)
428 return std::move(Sprintf(Sprintf("%%.%df%%%%", precision).c_str(), value * 100));
429 else
430 return std::move(Sprintf(Sprintf("%%.%df", precision).c_str(), value));
431}
432
445inline Percent& Percent::Assign(double value, bool is_percent) {
446 this->value = value;
447 this->is_percent = is_percent;
448
449 return *this;
450}
451
464inline Percent& Percent::Assign(int value, bool is_percent) {
465 this->value = value;
466 this->is_percent = is_percent;
467
468 return *this;
469}
470
482inline bool Percent::IsPercent() const {
483 return is_percent;
484}
485
486} // namespace cm
487
488#endif
百分比类
Definition percent.hpp:35
friend T operator+(const T &value, const Percent &percent)
百分比类重载加法运算符
Definition percent.hpp:330
T & SubtractPercent(T &value) const
实现百分比类的百分比减法
Definition percent.hpp:269
Percent()
百分比类的默认构造函数
Definition percent.hpp:91
~Percent()
百分比类的析构函数
Definition percent.hpp:135
T & DividePercent(T &value) const
实现百分比类的百分比除法
Definition percent.hpp:309
friend T operator*(const T &value, const Percent &percent)
百分比类重载乘法运算符
Definition percent.hpp:372
std::string Percentage(uint precision=2) const
获取百分数字符串
Definition percent.hpp:426
friend std::ostream & operator<<(std::ostream &out, const Percent &percent)
百分比类重载输出流运算符
Definition percent.hpp:149
T & AddPercent(T &value) const
实现百分比类的百分比加法
Definition percent.hpp:249
friend T operator/(const T &value, const Percent &percent)
百分比类重载除法运算符
Definition percent.hpp:393
T & MultiplyPercent(T &value) const
实现百分比类的百分比乘法
Definition percent.hpp:289
T Value() const
获取百分比的值
Definition percent.hpp:411
friend T operator-(const T &value, const Percent &percent)
百分比类重载减法运算符
Definition percent.hpp:351
Percent & Assign(double value, bool is_percent=true)
百分比类的赋值函数
Definition percent.hpp:445
bool IsPercent() const
判断是否是百分比
Definition percent.hpp:482
T operator*(const T &value, const Percent &percent)
百分比类重载乘法运算符
Definition percent.hpp:372
unsigned int uint
无符号整型
Definition type.h:22
std::string Sprintf(const char *format,...)
格式化输出字符串
Definition string.hpp:47
T operator-(const T &value, const Percent &percent)
百分比类重载减法运算符
Definition percent.hpp:351
T operator/(const T &value, const Percent &percent)
百分比类重载除法运算符
Definition percent.hpp:393
std::ostream & operator<<(std::ostream &out, const Interval &interval)
区间类重载输出流运算符
Definition interval.hpp:328
List< U > operator+(const List< U > &list1, const List< U > &list2)
列表类重载加法运算符
Definition list.hpp:192