Learn-to-Compress / headers / bignumber.h
bignumber.h
Raw
#ifndef BigNumber_H
#define BigNumber_H

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
constexpr auto precision = 50;


class BigNumber
{
public:
	template<class T>BigNumber(const T& value);
	
	bool isNegative() const;
	bool isPositive() const;
	bool isDecimal() const;
	BigNumber negate();
	BigNumber trimLeadingZeros();
	BigNumber normalize();
	int getPointIndex();
	// length of integer
	int getIntLength();
	// length of decimal (including decimal point)
	int getDecLength();
	std::string getString();
	BigNumber setString(const std::string& newStr);
	

	BigNumber add(BigNumber other);
	BigNumber subtract(BigNumber other);
	BigNumber multiply(BigNumber other);
	BigNumber divide(BigNumber other);
	bool equals(const BigNumber& other);

	friend BigNumber operator+(BigNumber bn1, const BigNumber& bn2);
	friend BigNumber operator-(BigNumber bn1, const BigNumber& bn2);
	friend BigNumber operator*(BigNumber bn1, const BigNumber& bn2);
	friend BigNumber operator/(BigNumber bn1, const BigNumber& bn2);
	friend bool operator==(BigNumber bn1, const BigNumber& bn2);

	friend std::ostream& operator<<(std::ostream& os, const BigNumber& num);
	friend bool operator>(BigNumber bn1, const BigNumber& bn2);
	friend bool operator<(BigNumber bn1, const BigNumber& bn2);
	friend bool operator>=(BigNumber bn1, const BigNumber& bn2);
	friend bool operator<=(BigNumber bn1, const BigNumber& bn2);

	BigNumber& operator=(const BigNumber& other);
	BigNumber& operator+=(const BigNumber& other);
	BigNumber& operator-=(const BigNumber& other);
	BigNumber& operator*=(const BigNumber& other);
	BigNumber& operator/=(const BigNumber& other);

	BigNumber& operator++();
	BigNumber& operator--();

	unsigned int operator[](int index);
private:
	std::string _numberString;
};


template<class T>
inline BigNumber::BigNumber(const T& value)
{
	std::stringstream ss;
	ss << value;
	std::string sout;
	sout = ss.str();
	if (sout == "") {
		sout = "0";
		/*std::cerr << "Warning: Initialization variable cannot be blank !" << std::endl;
		return;*/
	}
	if (sout.find_first_not_of('0') != std::string::npos) {
		sout.assign(sout.begin() + sout.find_first_not_of('0'), sout.end());
	}
	if (sout.find_first_not_of('.') == 1) {
		sout.insert(sout.begin(), '0');
	}
	if (sout.find_last_not_of('0') != std::string::npos) {
		if (sout.find_first_of('.') != std::string::npos) {
			if (sout.find_first_not_of('.') != std::string::npos)
				sout.assign(sout.begin(), sout.begin() + sout.find_last_not_of('0') + 1);
		}
	}
	if (sout.at(sout.size() - 1) == '.') {
		sout.erase(sout.size() - 1, sout.size());
	}
	if (sout.find("-.") != std::string::npos) {
		sout.insert(sout.find("-.") + 1, "0");
	}
	this->_numberString = sout;
}

#endif