今回ご紹介するのは分数を文字列として表示したり返したり、文字列から対応する分数クラスのインスタンスを返したりする関数です。

関数toString()とtoBunsu()は今日記事に載せる直前まで整数に対応させることをすっかり忘れていて、途中から整数に対応するように書き換えたので、あまりスマートな変換方法ではないかもしれません。

ちなみに関数toBunsu()は静的メンバ関数です。文字列から分数に変換するのにそれぞれのインスタンスごとに関数を使う意味はありませんからね。

C++ Bunsu.h

2011/02/22 更新:メンバを追加。デストラクタを追加。
#ifndef _ISO_BUNSU_H_
#define _ISO_BUNSU_H_
class Bunsu
{
private:
	char* str;	// 文字列
	int  keta(int a) const;		// (inline)引数の桁数を返す。
public:
	// デストラクタ
	~Bunsu(void);

	// 文字列表記
	void print(void);
	const char* toString(void);
	static Bunsu toBunsu(const char* s);
};
// 引数の桁数を返す。
inline int Bunsu::keta(int a) const{
	int count = 0;
	a = abso(a);
	while(a > 0){
		a /= 10;
		count++;
	}
	return count;
}
#endif

C++ Bunsu.cpp

#include "Bunsu.h"
#include <stdlib.h>
#include <string.h>

// デストラクタ
Bunsu::~Bunsu(void)
{
	if (this->str != NULL)
			delete [] this->str;
}

// 文字列表記
void Bunsu::print(void){
	std::cout << bunsi << std::flush;
	if (bunbo != 1)
		std::cout << " / " << bunbo << std::flush;
	std::cout << std::endl;
}
// 分数から文字列への変換
const char* Bunsu::toString(void){
	int count = 0;		// 数値の桁数カウンター
	int m_f = 0;		// マイナスフラグ

	count += keta(getBunsi());
	count += keta(getBunbo());
	if (getBunsi() < 0)
		++m_f;

	if (this->str != NULL)
		delete [] this->str;

	this->str = new char[count + m_f + 3 + 1];

	char buf[64];

	if (getBunbo() != 1)
		sprintf(buf, "%d / %d", getBunsi(), getBunbo());
	else
		sprintf(buf, "%d", getBunsi());
	strcpy(this->str, buf);

	return this->str;
}
// 文字列から分数への変換
Bunsu Bunsu::toBunsu(const char* s){
	int bunsi;
	int bunbo;
	int i = 0;
	char tmp[64];
	bool op = false;

	while(s[i]){
		if (s[i] == '/'){
			op = true;
			break;
		}
		i++;
	}

	i = 0;
	while(*s){
		if (*s == '-' || *s >= '0' && *s <= '9') {
			tmp[i++] = *s;
		} else if (*s == '/') {
			bunsi = atoi(tmp);
			i = 0;
		}
		*s++;
	}
	if (op != true){
		bunsi = atoi(tmp);
		tmp[0] = '1';
		tmp[1] = '¥0';
	}
	tmp[i] = '¥0';
	bunbo = atoi(tmp);

	return Bunsu(bunsi, bunbo);
}