2014-07-25 05:31:46 +08:00
|
|
|
#include <algorithm>
|
2015-10-17 06:35:11 +08:00
|
|
|
#include <regex>
|
2014-07-25 05:31:46 +08:00
|
|
|
|
2015-10-24 02:42:36 +08:00
|
|
|
#include <xlnt/common/hash_combine.hpp>
|
2014-08-14 06:56:34 +08:00
|
|
|
#include <xlnt/styles/number_format.hpp>
|
2014-07-24 04:00:09 +08:00
|
|
|
|
2015-10-24 02:42:36 +08:00
|
|
|
namespace {
|
|
|
|
|
|
|
|
const std::unordered_map<int, std::string> &builtin_formats()
|
2014-07-24 04:00:09 +08:00
|
|
|
{
|
2014-08-02 04:46:54 +08:00
|
|
|
static const std::unordered_map<int, std::string> formats =
|
|
|
|
{
|
|
|
|
{0, "General"},
|
|
|
|
{1, "0"},
|
|
|
|
{2, "0.00"},
|
|
|
|
{3, "#,##0"},
|
|
|
|
{4, "#,##0.00"},
|
|
|
|
{5, "\"$\"#,##0_);(\"$\"#,##0)"},
|
|
|
|
{6, "\"$\"#,##0_);[Red](\"$\"#,##0)"},
|
|
|
|
{7, "\"$\"#,##0.00_);(\"$\"#,##0.00)"},
|
|
|
|
{8, "\"$\"#,##0.00_);[Red](\"$\"#,##0.00)"},
|
|
|
|
{9, "0%"},
|
|
|
|
{10, "0.00%"},
|
|
|
|
{11, "0.00E+00"},
|
|
|
|
{12, "# ?/?"},
|
|
|
|
{13, "# \?\?/??"}, //escape trigraph
|
|
|
|
{14, "mm-dd-yy"},
|
|
|
|
{15, "d-mmm-yy"},
|
|
|
|
{16, "d-mmm"},
|
|
|
|
{17, "mmm-yy"},
|
|
|
|
{18, "h:mm AM/PM"},
|
|
|
|
{19, "h:mm:ss AM/PM"},
|
|
|
|
{20, "h:mm"},
|
|
|
|
{21, "h:mm:ss"},
|
|
|
|
{22, "m/d/yy h:mm"},
|
2015-10-24 02:42:36 +08:00
|
|
|
|
2014-08-02 04:46:54 +08:00
|
|
|
{37, "#,##0_);(#,##0)"},
|
|
|
|
{38, "#,##0_);[Red](#,##0)"},
|
|
|
|
{39, "#,##0.00_);(#,##0.00)"},
|
|
|
|
{40, "#,##0.00_);[Red](#,##0.00)"},
|
2015-10-24 02:42:36 +08:00
|
|
|
|
2014-08-02 04:46:54 +08:00
|
|
|
{41, "_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"_);_(@_)"},
|
|
|
|
{42, "_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"_);_(@_)"},
|
|
|
|
{43, "_(* #,##0.00_);_(* \\(#,##0.00\\);_(* \"-\"??_);_(@_)"},
|
2015-10-24 02:42:36 +08:00
|
|
|
|
2014-08-02 04:46:54 +08:00
|
|
|
{44, "_(\"$\"* #,##0.00_)_(\"$\"* \\(#,##0.00\\)_(\"$\"* \"-\"??_)_(@_)"},
|
|
|
|
{45, "mm:ss"},
|
|
|
|
{46, "[h]:mm:ss"},
|
|
|
|
{47, "mmss.0"},
|
|
|
|
{48, "##0.0E+0"},
|
|
|
|
{49, "@"}
|
2015-10-24 02:42:36 +08:00
|
|
|
|
2014-08-02 04:46:54 +08:00
|
|
|
//EXCEL differs from the standard in the following:
|
|
|
|
//{14, "m/d/yyyy"},
|
|
|
|
//{22, "m/d/yyyy h:mm"},
|
|
|
|
//{37, "#,##0_);(#,##0)"},
|
|
|
|
//{38, "#,##0_);[Red]"},
|
|
|
|
//{39, "#,##0.00_);(#,##0.00)"},
|
|
|
|
//{40, "#,##0.00_);[Red]"},
|
|
|
|
//{47, "mm:ss.0"},
|
|
|
|
//{55, "yyyy/mm/dd"}
|
|
|
|
};
|
2015-10-24 02:42:36 +08:00
|
|
|
|
2014-08-02 04:46:54 +08:00
|
|
|
return formats;
|
|
|
|
}
|
2015-10-24 02:42:36 +08:00
|
|
|
|
|
|
|
} // namespace
|
2014-08-02 04:46:54 +08:00
|
|
|
|
2015-10-24 02:42:36 +08:00
|
|
|
namespace xlnt {
|
2014-08-02 04:46:54 +08:00
|
|
|
|
2015-10-24 02:42:36 +08:00
|
|
|
const number_format number_format::general()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(0), 0);
|
|
|
|
return format;
|
2015-10-07 00:31:49 +08:00
|
|
|
}
|
2015-10-24 02:42:36 +08:00
|
|
|
|
|
|
|
const number_format number_format::text()
|
2015-10-07 00:31:49 +08:00
|
|
|
{
|
2015-10-24 02:42:36 +08:00
|
|
|
static const number_format format(builtin_formats().at(49), 49);
|
|
|
|
return format;
|
|
|
|
}
|
2015-10-07 00:31:49 +08:00
|
|
|
|
2015-10-24 02:42:36 +08:00
|
|
|
const number_format number_format::number()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(1), 1);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::number_00()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(2), 2);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::number_comma_separated1()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(4), 4);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::number_comma_separated2()
|
|
|
|
{
|
|
|
|
static const number_format format("#,##0.00_-");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::percentage()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(9), 9);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::percentage_00()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(10), 10);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_yyyymmdd2()
|
|
|
|
{
|
|
|
|
static const number_format format("yyyy-mm-dd");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_yyyymmdd()
|
|
|
|
{
|
|
|
|
static const number_format format("yy-mm-dd");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_ddmmyyyy()
|
|
|
|
{
|
|
|
|
static const number_format format("dd/mm/yy");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_dmyslash()
|
|
|
|
{
|
|
|
|
static const number_format format("d/m/y");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_dmyminus()
|
|
|
|
{
|
|
|
|
static const number_format format("d-m-y");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_dmminus()
|
|
|
|
{
|
|
|
|
static const number_format format("d-m");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_myminus()
|
|
|
|
{
|
|
|
|
static const number_format format("m-y");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_xlsx14()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(14), 14);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_xlsx15()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(15), 15);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_xlsx16()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(16), 16);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_xlsx17()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(17), 17);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_xlsx22()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(22), 22);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_datetime()
|
|
|
|
{
|
|
|
|
static const number_format format("yyyy-mm-dd h:mm:ss");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_time1()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(18), 18);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_time2()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(19), 19);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_time3()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(20), 20);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_time4()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(21), 21);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_time5()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(45), 45);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_time6()
|
|
|
|
{
|
|
|
|
static const number_format format(builtin_formats().at(21), 21);
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_time7()
|
|
|
|
{
|
|
|
|
static const number_format format("i:s.S");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_time8()
|
|
|
|
{
|
|
|
|
static const number_format format("h:mm:ss@");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_timedelta()
|
|
|
|
{
|
|
|
|
static const number_format format("[hh]:mm:ss");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::date_yyyymmddslash()
|
|
|
|
{
|
|
|
|
static const number_format format("yy/mm/dd@");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::currency_usd_simple()
|
|
|
|
{
|
|
|
|
static const number_format format("\"$\"#,##0.00_-");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::currency_usd()
|
|
|
|
{
|
|
|
|
static const number_format format("$#,##0_-");
|
|
|
|
return format;
|
|
|
|
}
|
|
|
|
|
|
|
|
const number_format number_format::currency_eur_simple()
|
|
|
|
{
|
|
|
|
static const number_format format("[$EUR ]#,##0.00_-");
|
|
|
|
return format;
|
2014-08-02 04:46:54 +08:00
|
|
|
}
|
2015-10-19 03:30:46 +08:00
|
|
|
|
2015-10-24 02:42:36 +08:00
|
|
|
number_format::number_format() : number_format(general())
|
2015-10-19 03:30:46 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-10-24 02:42:36 +08:00
|
|
|
number_format::number_format(int id) : number_format(from_builtin_id(id))
|
2015-10-19 03:30:46 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-10-24 02:42:36 +08:00
|
|
|
number_format::number_format(const std::string &format_string, int id)
|
2015-10-19 03:30:46 +08:00
|
|
|
{
|
2015-10-24 02:42:36 +08:00
|
|
|
set_format_string(format_string, id);
|
2015-10-19 03:30:46 +08:00
|
|
|
}
|
|
|
|
|
2015-10-24 02:42:36 +08:00
|
|
|
number_format number_format::from_builtin_id(int builtin_id)
|
2014-07-24 08:51:28 +08:00
|
|
|
{
|
2015-10-24 02:42:36 +08:00
|
|
|
if(builtin_formats().find(builtin_id) == builtin_formats().end())
|
2014-07-24 08:51:28 +08:00
|
|
|
{
|
2015-10-24 02:42:36 +08:00
|
|
|
throw std::runtime_error("unknown id: " + std::to_string(builtin_id));
|
2014-07-24 08:51:28 +08:00
|
|
|
}
|
|
|
|
|
2015-10-24 02:42:36 +08:00
|
|
|
auto format_string = builtin_formats().at(builtin_id);
|
|
|
|
return number_format(format_string, builtin_id);
|
2014-07-24 08:51:28 +08:00
|
|
|
}
|
2014-07-24 04:00:09 +08:00
|
|
|
|
2015-10-19 03:30:46 +08:00
|
|
|
std::string number_format::get_format_string() const
|
|
|
|
{
|
|
|
|
return format_string_;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::size_t number_format::hash() const
|
|
|
|
{
|
2015-10-24 02:42:36 +08:00
|
|
|
std::size_t seed = static_cast<std::size_t>(id_);
|
|
|
|
hash_combine(seed, format_string_);
|
|
|
|
|
|
|
|
return seed;
|
2015-10-19 03:30:46 +08:00
|
|
|
}
|
|
|
|
|
2015-10-24 02:42:36 +08:00
|
|
|
void number_format::set_format_string(const std::string &format_string, int id)
|
2015-10-07 00:31:49 +08:00
|
|
|
{
|
2015-10-19 03:30:46 +08:00
|
|
|
format_string_ = format_string;
|
2015-10-24 02:42:36 +08:00
|
|
|
id_ = id;
|
2015-10-19 03:30:46 +08:00
|
|
|
|
2015-10-24 02:42:36 +08:00
|
|
|
if(id_ == -1)
|
2015-10-07 00:31:49 +08:00
|
|
|
{
|
2015-10-24 02:42:36 +08:00
|
|
|
for(const auto &pair : builtin_formats())
|
2015-10-19 03:30:46 +08:00
|
|
|
{
|
|
|
|
if(pair.second == format_string)
|
|
|
|
{
|
2015-10-24 02:42:36 +08:00
|
|
|
id_ = pair.first;
|
2015-10-19 03:30:46 +08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2015-10-07 00:31:49 +08:00
|
|
|
}
|
2015-10-19 03:30:46 +08:00
|
|
|
}
|
|
|
|
|
2014-07-24 04:00:09 +08:00
|
|
|
} // namespace xlnt
|