add: Duration::Parse to format a duration
This commit is contained in:
parent
02e418d0e2
commit
fe70a520b1
|
|
@ -342,6 +342,8 @@ namespace easy2d
|
||||||
// 5 Ãë: Duration::Second * 5
|
// 5 Ãë: Duration::Second * 5
|
||||||
// 1.5 Сʱ: Duration::Hour * 1.5
|
// 1.5 Сʱ: Duration::Hour * 1.5
|
||||||
// 3 Сʱ 45 ·Ö 15 Ãë: Duration::Hour * 3 + Duration::Minute * 45 + Duration::Second * 15
|
// 3 Сʱ 45 ·Ö 15 Ãë: Duration::Hour * 3 + Duration::Minute * 45 + Duration::Second * 15
|
||||||
|
// 时间段转化为秒: float s = duration.Seconds();
|
||||||
|
// 时间段格式化: Duration d = Duration::Parse(L"1h35m"); // 1小时35分钟
|
||||||
//
|
//
|
||||||
class Duration
|
class Duration
|
||||||
{
|
{
|
||||||
|
|
@ -358,18 +360,24 @@ namespace easy2d
|
||||||
int milliseconds
|
int milliseconds
|
||||||
);
|
);
|
||||||
|
|
||||||
// 获取毫秒数
|
// 转化为毫秒
|
||||||
int Milliseconds() const;
|
int Milliseconds() const;
|
||||||
|
|
||||||
// 获取秒数
|
// 转化为秒
|
||||||
float Seconds() const;
|
float Seconds() const;
|
||||||
|
|
||||||
// 获取分钟数
|
// 转化为分钟
|
||||||
float Minutes() const;
|
float Minutes() const;
|
||||||
|
|
||||||
// 获取小时数
|
// 转化为小时
|
||||||
float Hours() const;
|
float Hours() const;
|
||||||
|
|
||||||
|
// 时间段格式化
|
||||||
|
// 时间段字符串允许是有符号的浮点数, 并且带有时间单位后缀
|
||||||
|
// 例如: "300ms", "-1.5h", "2h45m"
|
||||||
|
// 允许的时间单位有 "ms", "s", "m", "h"
|
||||||
|
static Duration Parse(const std::wstring& str);
|
||||||
|
|
||||||
bool operator== (const Duration &) const;
|
bool operator== (const Duration &) const;
|
||||||
bool operator!= (const Duration &) const;
|
bool operator!= (const Duration &) const;
|
||||||
bool operator> (const Duration &) const;
|
bool operator> (const Duration &) const;
|
||||||
|
|
@ -379,6 +387,7 @@ namespace easy2d
|
||||||
|
|
||||||
Duration operator + (Duration const &) const;
|
Duration operator + (Duration const &) const;
|
||||||
Duration operator - (Duration const &) const;
|
Duration operator - (Duration const &) const;
|
||||||
|
Duration operator - () const;
|
||||||
Duration operator * (int) const;
|
Duration operator * (int) const;
|
||||||
Duration operator * (float) const;
|
Duration operator * (float) const;
|
||||||
Duration operator * (double) const;
|
Duration operator * (double) const;
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
|
|
||||||
#include "..\e2dutil.h"
|
#include "..\e2dutil.h"
|
||||||
|
#include <regex>
|
||||||
|
|
||||||
|
|
||||||
const easy2d::Duration easy2d::Duration::Millisecond = easy2d::Duration(1);
|
const easy2d::Duration easy2d::Duration::Millisecond = easy2d::Duration(1);
|
||||||
|
|
@ -62,6 +63,85 @@ float easy2d::Duration::Hours() const
|
||||||
return static_cast<float>(hour) + static_cast<float>(ms) / (60 * 60 * 1000.f);
|
return static_cast<float>(hour) + static_cast<float>(ms) / (60 * 60 * 1000.f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
easy2d::Duration easy2d::Duration::Parse(const std::wstring & str)
|
||||||
|
{
|
||||||
|
typedef std::map<std::wstring, Duration> UnitMap;
|
||||||
|
static const auto regex = std::wregex(L"[-+]?([0-9]*(\\.[0-9]*)?[a-z]+)+");
|
||||||
|
static const auto unit_map = UnitMap{{L"ms", Millisecond}, {L"s", Second}, {L"m", Minute}, {L"h", Hour}};
|
||||||
|
|
||||||
|
size_t len = str.length();
|
||||||
|
size_t pos = 0;
|
||||||
|
bool negative = false;
|
||||||
|
Duration d;
|
||||||
|
|
||||||
|
if (!std::regex_match(str, regex))
|
||||||
|
{
|
||||||
|
E2D_WARNING("Duration::Parse: invalid duration");
|
||||||
|
return std::move(Duration{});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str.empty() || str == L"0") { return std::move(Duration{}); }
|
||||||
|
|
||||||
|
// ·ûºÅλ
|
||||||
|
if (str[0] == L'-' || str[0] == L'+')
|
||||||
|
{
|
||||||
|
negative = (str[0] == L'-');
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (pos < len)
|
||||||
|
{
|
||||||
|
// ÊýÖµ
|
||||||
|
size_t i = pos;
|
||||||
|
for (; i < len; ++i)
|
||||||
|
{
|
||||||
|
wchar_t ch = str[i];
|
||||||
|
if (!(ch == L'.' || L'0' <= ch && ch <= L'9'))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring num_str = str.substr(pos, i - pos);
|
||||||
|
pos = i;
|
||||||
|
|
||||||
|
if (num_str.empty() || num_str == L".")
|
||||||
|
{
|
||||||
|
E2D_WARNING("Duration::Parse: invalid duration");
|
||||||
|
return std::move(Duration{});
|
||||||
|
}
|
||||||
|
|
||||||
|
// µ¥Î»
|
||||||
|
for (; i < len; ++i)
|
||||||
|
{
|
||||||
|
wchar_t ch = str[i];
|
||||||
|
if (ch == L'.' || L'0' <= ch && ch <= L'9')
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring unit_str = str.substr(pos, i - pos);
|
||||||
|
pos = i;
|
||||||
|
|
||||||
|
if (unit_map.find(unit_str) == unit_map.end())
|
||||||
|
{
|
||||||
|
E2D_WARNING("Duration::Parse: invalid duration");
|
||||||
|
return std::move(Duration{});
|
||||||
|
}
|
||||||
|
|
||||||
|
double num = std::stod(num_str);
|
||||||
|
Duration unit = unit_map.at(unit_str);
|
||||||
|
d += unit * num;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (negative)
|
||||||
|
{
|
||||||
|
d.milliseconds_ = -d.milliseconds_;
|
||||||
|
}
|
||||||
|
return std::move(d);
|
||||||
|
}
|
||||||
|
|
||||||
bool easy2d::Duration::operator==(const Duration & other) const
|
bool easy2d::Duration::operator==(const Duration & other) const
|
||||||
{
|
{
|
||||||
return milliseconds_ == other.milliseconds_;
|
return milliseconds_ == other.milliseconds_;
|
||||||
|
|
@ -104,6 +184,12 @@ easy2d::Duration easy2d::Duration::operator-(Duration const & other) const
|
||||||
return std::move(d);
|
return std::move(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
easy2d::Duration easy2d::Duration::operator-() const
|
||||||
|
{
|
||||||
|
Duration d(-milliseconds_);
|
||||||
|
return std::move(d);
|
||||||
|
}
|
||||||
|
|
||||||
easy2d::Duration easy2d::Duration::operator*(int value) const
|
easy2d::Duration easy2d::Duration::operator*(int value) const
|
||||||
{
|
{
|
||||||
Duration d(milliseconds_ * value);
|
Duration d(milliseconds_ * value);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue