NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
locale.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_SYSTEM_LOCALE_HPP__
2#define NEFORCE_CORE_SYSTEM_LOCALE_HPP__
3
11
13#include "NeForce/core/exception/system_exception.hpp"
14NEFORCE_BEGIN_NAMESPACE__
15
16class date;
17class time;
18class datetime;
19class timestamp;
20
21
27
32struct locale_exception final : system_exception {
33 explicit locale_exception(const char* info = "Locale Operation Failed",
34 const error_code code = last_error()) noexcept :
35 system_exception(info, code) {}
36
37 explicit locale_exception(const exception& e) :
38 system_exception(e) {}
39
40 ~locale_exception() override = default;
41
42 NEFORCE_NODISCARD const char* type() const noexcept override { return "locale_exception"; }
43};
44 // Exceptions
46
52
66class NEFORCE_API locale {
67public:
73 primary = 0,
74 secondary = 1,
75 tertiary = 2,
76 quaternary = 3,
77 identical = 15
78 };
79
84 enum class date_style : int8_t {
85 none = -1,
86 full = 0,
87 long_fmt = 1,
88 medium = 2,
89 short_fmt = 3,
90 relative = 4
91 };
92
97 enum class time_style : int8_t {
98 none = -1,
99 full = 0,
100 long_fmt = 1,
101 medium = 2,
102 short_fmt = 3,
103 relative = 4
104 };
105
111 SI,
112 US,
113 UK
114 };
115
120 enum class text_direction : uint8_t {
121 LTR,
122 RTL
123 };
124
140
161
177
178private:
179 string name_;
180 string icu_name_;
181 void* collator_{nullptr};
182 void* converter_{nullptr};
183
184 mutable void* num_fmt_{nullptr};
185 mutable void* curr_fmt_{nullptr};
186 mutable void* date_fmt_{nullptr};
187
188 string language_code_;
189 string script_code_;
190 string country_code_;
191 string variant_code_;
192
198 void load(const string& bcp47);
199
203 void cleanup() noexcept;
204
205public:
210
216 explicit locale(const string& name);
217
222
227 locale(const locale& other);
228
234 locale& operator=(const locale& other);
235
240 locale(locale&& other) noexcept;
241
247 locale& operator=(locale&& other) noexcept;
248
253 NEFORCE_NODISCARD static locale classic();
254
259 NEFORCE_NODISCARD static locale system();
260
266 NEFORCE_NODISCARD static locale from_name(const string& name);
267
272 NEFORCE_NODISCARD const string& name() const noexcept { return name_; }
273
278 NEFORCE_NODISCARD const string& language_code() const noexcept { return language_code_; }
279
284 NEFORCE_NODISCARD const string& script_code() const noexcept { return script_code_; }
285
290 NEFORCE_NODISCARD const string& country_code() const noexcept { return country_code_; }
291
296 NEFORCE_NODISCARD const string& variant_code() const noexcept { return variant_code_; }
297
303 NEFORCE_NODISCARD string display_name(const locale& display_locale) const;
304
309 NEFORCE_NODISCARD string native_language_name() const;
310
315 NEFORCE_NODISCARD string native_country_name() const;
316
321 NEFORCE_NODISCARD text_direction direction() const;
322
327 NEFORCE_NODISCARD measurement_system measurement() const;
328
333 NEFORCE_NODISCARD int32_t first_day_of_week() const;
334
342 NEFORCE_NODISCARD vector<string> ui_languages() const;
343
344 NEFORCE_NODISCARD static bool is_alpha(char32_t cp) noexcept;
345 NEFORCE_NODISCARD static bool is_digit(char32_t cp) noexcept;
346 NEFORCE_NODISCARD static bool is_alnum(char32_t cp) noexcept;
347 NEFORCE_NODISCARD static bool is_space(char32_t cp) noexcept;
348 NEFORCE_NODISCARD static bool is_upper(char32_t cp) noexcept;
349 NEFORCE_NODISCARD static bool is_lower(char32_t cp) noexcept;
350 NEFORCE_NODISCARD static bool is_punct(char32_t cp) noexcept;
351 NEFORCE_NODISCARD static bool is_print(char32_t cp) noexcept;
352 NEFORCE_NODISCARD static bool is_titlecase(char32_t cp) noexcept;
353 NEFORCE_NODISCARD static bool is_white_space(char32_t cp) noexcept;
354
355 NEFORCE_NODISCARD static char32_t to_upper(char32_t cp) noexcept;
356 NEFORCE_NODISCARD static char32_t to_lower(char32_t cp) noexcept;
357 NEFORCE_NODISCARD static char32_t to_titlecase(char32_t cp) noexcept;
358
366 NEFORCE_NODISCARD int compare(const string& a, const string& b,
368
374 NEFORCE_NODISCARD string collation_key(const string& s) const;
375
382 NEFORCE_NODISCARD string to_multibyte(const u32string& ucs4) const;
383
390 NEFORCE_NODISCARD u32string to_ucs4(const string& mb) const;
391
397 NEFORCE_NODISCARD string format_number(int64_t value) const;
398
405 NEFORCE_NODISCARD string format_number(double value, int32_t fraction_digits = 2) const;
406
413 NEFORCE_NODISCARD string format_currency(double value, const string& iso_4217_code) const;
414
422 NEFORCE_NODISCARD string format_datetime(const datetime& dt, date_style ds = date_style::medium,
423 time_style ts = time_style::medium) const;
424
433 NEFORCE_NODISCARD string format_datetime(const datetime& dt, const string& pattern) const;
434
439 NEFORCE_NODISCARD string format_datetime() const;
440
445 NEFORCE_NODISCARD numeric_info numeric() const;
446
451 NEFORCE_NODISCARD monetary_info monetary() const;
452
457 NEFORCE_NODISCARD time_info time() const;
458
463 NEFORCE_NODISCARD static vector<string> available_locales();
464
470 NEFORCE_NODISCARD static vector<string> available_countries(const string& language);
471
477 NEFORCE_NODISCARD static bool is_valid_locale(const string& name);
478
484 NEFORCE_NODISCARD bool operator==(const locale& o) const noexcept { return name_ == o.name_; }
485
491 NEFORCE_NODISCARD bool operator!=(const locale& o) const noexcept { return !(*this == o); }
492};
493 // Locale
495
496NEFORCE_END_NAMESPACE__
497#endif // NEFORCE_CORE_SYSTEM_LOCALE_HPP__
日期时间类
string format_number(double value, int32_t fraction_digits=2) const
格式化浮点数
static vector< string > available_countries(const string &language)
获取指定语言下的可用国家/地区
string display_name(const locale &display_locale) const
获取在该 locale 中的显示名
vector< string > ui_languages() const
获取 UI 语言回退链
string format_datetime() const
格式化当前日期时间
string format_datetime(const datetime &dt, const string &pattern) const
使用 ICU 模式字符串格式化日期时间
static bool is_digit(char32_t cp) noexcept
是否为数字
static bool is_alpha(char32_t cp) noexcept
是否为字母
locale()
默认构造函数,创建 en-US-POSIX locale
int compare(const string &a, const string &b, collate_strength strength=collate_strength::tertiary) const
比较两个字符串
string format_currency(double value, const string &iso_4217_code) const
格式化货币金额
const string & name() const noexcept
获取规范 BCP-47 名称
static locale system()
获取系统默认 locale
time_info time() const
获取时间格式信息
u32string to_ucs4(const string &mb) const
将 locale 编码的多字节字符串转换为 UTF-32
static bool is_print(char32_t cp) noexcept
是否为可打印字符
numeric_info numeric() const
获取数字格式信息
monetary_info monetary() const
获取货币格式信息
static vector< string > available_locales()
获取所有可用 locale 列表
collate_strength
字符串比较强度
@ tertiary
三级比较:区分大小写
string format_datetime(const datetime &dt, date_style ds=date_style::medium, time_style ts=time_style::medium) const
格式化日期时间
static char32_t to_upper(char32_t cp) noexcept
转换为大写
static bool is_white_space(char32_t cp) noexcept
是否为 Unicode 空白字符
string native_language_name() const
获取本地语言名
static bool is_titlecase(char32_t cp) noexcept
是否为首字母大写
time_style
时间格式化风格
@ medium
中格式:"3:45:30 PM"
string native_country_name() const
获取本地国家/地区名
date_style
日期格式化风格
@ medium
中格式:"Apr 15, 2025"
text_direction direction() const
获取文字方向
static bool is_alnum(char32_t cp) noexcept
是否为字母或数字
const string & script_code() const noexcept
获取 ISO 15924 文字代码
static bool is_valid_locale(const string &name)
验证 locale 名称是否有效
string format_number(int64_t value) const
格式化整数
static bool is_upper(char32_t cp) noexcept
是否为大写字母
static bool is_punct(char32_t cp) noexcept
是否为标点符号
const string & variant_code() const noexcept
获取变体代码
string to_multibyte(const u32string &ucs4) const
将 UTF-32 字符串转换为 locale 编码的多字节字符串
measurement_system measurement() const
获取度量系统
static bool is_lower(char32_t cp) noexcept
是否为小写字母
bool operator==(const locale &o) const noexcept
相等比较
static char32_t to_lower(char32_t cp) noexcept
转换为小写
static locale from_name(const string &name)
从名称构造 locale
measurement_system
度量系统
text_direction
文字方向
string collation_key(const string &s) const
生成排序键
const string & language_code() const noexcept
获取 ISO 639 语言代码
static char32_t to_titlecase(char32_t cp) noexcept
转换为首字母大写
static bool is_space(char32_t cp) noexcept
是否为空白字符(POSIX/C)
static locale classic()
获取经典(en-US-POSIX)locale
int32_t first_day_of_week() const
获取一周首日
bool operator!=(const locale &o) const noexcept
不等比较
const string & country_code() const noexcept
获取 ISO 3166 国家/地区代码
动态大小数组容器
long int64_t
64位有符号整数类型
unsigned char uint8_t
8位无符号整数类型
int int32_t
32位有符号整数类型
signed char int8_t
8位有符号整数类型
error_code last_error() noexcept
获取当前系统错误码
constexpr none_t none
默认空表示
basic_string< char32_t > u32string
UTF-32字符串
string mon_thousands_sep
货币千位分隔符
string mon_decimal_point
货币小数点
int32_t p_sep_by_space
正数货币符号间距
int32_t cash_frac_digits
现金小数位数
string currency_symbol
货币符号
string int_curr_symbol
国际货币符号(ISO 4217)
int32_t frac_digits
本地货币小数位数
bool p_cs_precedes
正数时货币符号前置
int32_t n_sep_by_space
负数货币符号间距
int32_t int_frac_digits
国际货币小数位数
bool n_cs_precedes
负数时货币符号前置
string mon_grouping
货币分组规则
string exponential
科学记数法符号
string thousands_sep
千位分隔符
string pm_str
下午标识
string datetime_fmt
日期时间格式模式
string am_str
上午标识
string time_fmt
时间格式模式
vector< string > day_names
星期几全名
vector< string > abbr_day_names
星期几缩写
string date_fmt
日期格式模式
vector< string > abbr_month_names
月份缩写
vector< string > month_names
月份全名
const char * type() const noexcept override
获取异常类型
动态大小数组容器