1#ifndef NEFORCE_CORE_SYSTEM_LOCALE_HPP__
2#define NEFORCE_CORE_SYSTEM_LOCALE_HPP__
13#include "NeForce/core/exception/system_exception.hpp"
14NEFORCE_BEGIN_NAMESPACE__
32struct locale_exception final : system_exception {
33 explicit locale_exception(
const char* info =
"Locale Operation Failed",
35 system_exception(info, code) {}
37 explicit locale_exception(
const exception& e) :
38 system_exception(e) {}
40 ~locale_exception()
override =
default;
42 NEFORCE_NODISCARD
const char*
type() const noexcept
override {
return "locale_exception"; }
181 void* collator_{
nullptr};
182 void* converter_{
nullptr};
184 mutable void* num_fmt_{
nullptr};
185 mutable void* curr_fmt_{
nullptr};
186 mutable void* date_fmt_{
nullptr};
188 string language_code_;
190 string country_code_;
191 string variant_code_;
198 void load(
const string& bcp47);
203 void cleanup() noexcept;
272 NEFORCE_NODISCARD const
string&
name() const noexcept {
return name_; }
278 NEFORCE_NODISCARD
const string&
language_code() const noexcept {
return language_code_; }
284 NEFORCE_NODISCARD
const string&
script_code() const noexcept {
return script_code_; }
290 NEFORCE_NODISCARD
const string&
country_code() const noexcept {
return country_code_; }
296 NEFORCE_NODISCARD
const string&
variant_code() const noexcept {
return variant_code_; }
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;
355 NEFORCE_NODISCARD
static char32_t to_upper(
char32_t cp)
noexcept;
356 NEFORCE_NODISCARD
static char32_t to_lower(
char32_t cp)
noexcept;
366 NEFORCE_NODISCARD
int compare(
const string& a,
const string& b,
413 NEFORCE_NODISCARD
string format_currency(
double value,
const string& iso_4217_code)
const;
484 NEFORCE_NODISCARD
bool operator==(
const locale& o)
const noexcept {
return name_ == o.name_; }
491 NEFORCE_NODISCARD
bool operator!=(
const locale& o)
const noexcept {
return !(*
this == o); }
496NEFORCE_END_NAMESPACE__
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 列表
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
是否为首字母大写
string native_country_name() const
获取本地国家/地区名
@ 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
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 国家/地区代码
unsigned char uint8_t
8位无符号整数类型
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 infinity_symbol
∞ 表示
string datetime_fmt
日期时间格式模式
vector< string > day_names
星期几全名
vector< string > abbr_day_names
星期几缩写
vector< string > abbr_month_names
月份缩写
vector< string > month_names
月份全名
const char * type() const noexcept override
获取异常类型