40 if (strBegin == std::string::npos)
44 const size_t strRange = strEnd - strBegin + 1;
46 return str.
substr(strBegin, strRange);
50bool BitcoinExchange::isValidDate(
const std::string &dateStr)
const {
51 if (dateStr.
length() != 10 || dateStr[4] !=
'-' || dateStr[7] !=
'-') {
59 for (
size_t i = 0; i < yearStr.
length(); ++i)
60 if (!isdigit(yearStr[i]))
62 for (
size_t i = 0; i < monthStr.
length(); ++i)
63 if (!isdigit(monthStr[i]))
65 for (
size_t i = 0; i < dayStr.
length(); ++i)
66 if (!isdigit(dayStr[i]))
73 if (month < 1 || month > 12 || day < 1 || day > 31) {
78 int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
80 if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
84 if (day > daysInMonth[month]) {
92bool BitcoinExchange::isValidValue(
const std::string &valueStr,
double &value)
const {
134 _exchangeRates[date] = rate;
158 size_t pos = line.
find(
" | ");
159 if (pos == std::string::npos) {
164 dateStr = trim(line.
substr(0, pos));
165 valueStr = trim(line.
substr(pos + 3));
167 if (!isValidDate(dateStr)) {
173 if (!isValidValue(valueStr, value)) {
182 if (it == _exchangeRates.
end() || it->first != dateStr) {
183 if (it == _exchangeRates.
begin()) {
190 double exchangeRate = it->second;
191 std::cout << dateStr <<
" => " << value <<
" = " << (value * exchangeRate) <<
std::endl;
ビットコインの価格情報に基づき価値を計算するBitcoinExchangeクラスを提供します。
ビットコインの価格データベースを管理し、入力ファイルに基づいて価値を計算するクラス。
void processInputFile(const std::string &filename)
指定された入力ファイルを処理し、各行のビットコインの価値を計算して出力します。
BitcoinExchange()
デフォルトコンストラクタ。
void loadDatabase(const std::string &filename)
CSV形式のデータベースファイルを読み込み、為替レートを内部マップに格納します。
~BitcoinExchange()
デストラクタ。
T find_first_not_of(T... args)
T find_last_not_of(T... args)