208#if DL_PLATFORM != DL_PLATFORM_APPLE
209 std::from_chars(str.data(), str.data() + str.size(), default_v);
215 if constexpr (std::is_same_v<Float, float>)
219 return std::stof(str.data());
226 else if constexpr (std::is_same_v<Float, double>)
230 return std::stod(str.data());
251inline std::vector<std::string_view>
ToView(
const std::vector<std::string>& a)
253 std::vector<std::string_view> ret;
279 auto iter = str.begin();
280 while (iter != str.end() &&
IsBlank(*iter))
284 auto iter1 = str.rbegin();
285 while (iter1 != str.rend() &&
IsBlank(*iter1))
290 return { iter, iter1.base() };
296inline int toInt(std::string_view str,
int default_v = 0)
298#if DL_PLATFORM != DL_PLATFORM_APPLE
299 std::from_chars(str.data(), str.data() + str.size(), default_v);
304 return std::stoi(str.data());
312inline unsigned toUint(std::string_view str,
unsigned default_v = 0)
314#if DL_PLATFORM != DL_PLATFORM_APPLE
315 std::from_chars(str.data(), str.data() + str.size(), default_v);
320 return std::stoul(str.data());
332inline int64_t
toInt64(std::string_view str, int64_t default_v = 0)
334#if DL_PLATFORM != DL_PLATFORM_APPLE
335 std::from_chars(str.data(), str.data() + str.size(), default_v);
340 return std::stoll(str.data());
351inline bool getInt(std::string_view str,
int& ret)
353#if DL_PLATFORM != DL_PLATFORM_APPLE
354 std::from_chars_result r = std::from_chars(str.data(), str.data() + str.size(), ret);
355 return r.ec == std::errc();
359 ret = std::stoi(str.data());
373inline bool toBool(std::string_view str,
bool default_v =
false)
375 return toInt(str, default_v);
380inline bool getByte(std::string_view str, std::byte& ret)
383#if DL_PLATFORM != DL_PLATFORM_APPLE
385 std::from_chars_result r = std::from_chars(str.data(), str.data() + str.size(), v, 16);
386 if (r.ec != std::errc())
393 ret = std::stoi(str.data(),
nullptr, 16);
405template<std::
size_t N>
408 std::vector<std::string_view> vec;
412 log_warn(
"分割后数量不匹配,将丢弃或填充0:{}/{}", vec.size(),
N);
417 for (
size_t i = 0; i <
N; ++i)
427template<std::
size_t N>
430 std::vector<std::string_view> vec;
434 log_warn(
"分割后数量不匹配,将丢弃或填充0:{}/{}", vec.size(),
N);
439 for (
size_t i = 0; i <
N; ++i)
461 bool has_dot =
false;
462 for (
size_t i = 0; i < str.size(); ++i)
464 const char& ch = str[i];
465 if (std::isdigit(ch))
467 else if (i == 0 && (ch ==
'+' || ch ==
'-'))
469 else if (!has_dot && ch ==
'.')
482inline std::string
AddQuotes(std::string_view str,
char quotes =
'\"')
485 ret.reserve(str.size() + 2);
499std::string
FillEndl(std::string_view str,
char ch =
' ');
505 return R
"(<>/\|:"*?)";
511inline void EraseNotFileName(std::string& name)
519inline void ToLower(std::string& str)
521 std::transform(str.begin(), str.end(), str.begin(), ::tolower);
527inline std::string ToLower(
const std::string& str)
529 std::string ret = str;
530 std::transform(ret.begin(), ret.end(), ret.begin(), ::tolower);
536inline void ToUpper(std::string& str)
538 std::transform(str.begin(), str.end(), str.begin(), ::toupper);
543inline std::string ToUpper(std::string_view str)
545 std::string ret{ str };
552inline bool EqualToLower(std::string_view a, std::string_view b)
554 if (a.size() != b.size())
558 for (
size_t i = 0; i < a.size(); ++i)
560 if (std::tolower(a[i]) != std::tolower(b[i]))
571inline bool toBoolEx(std::string_view str,
bool default_v =
false)
576 else if (String::EqualToLower(str,
"true"))
578 else if (String::EqualToLower(str,
"false"))
586inline std::string Splicing(
const std::vector<std::string>& vec,
587 std::string_view delimiter =
", ", std::string_view end =
"")
595 for (
size_t i = 0; i < vec.size() - 1; ++i)
600 ret += vec[vec.size() - 1];
608inline std::string EraseCharAll(std::string_view str, std::string_view vec_char)
611 for (
auto& iter : str)
622inline std::string EraseCharN(std::string_view str, std::string_view vec_char,
size_t n = 1)
626 for (
auto& iter : str)
642inline std::string EraseCharHead(std::string_view str, std::string_view vec_char)
647 for (
auto& iter : str)
667inline std::string EraseBlank(std::string_view str)
669 return EraseCharAll(str,
" \t\n");
674inline std::string EraseBlankN(std::string_view str,
size_t n = 1)
676 return EraseCharN(str,
" \t\n", n);
681inline std::string EraseBlankHead(std::string_view str)
683 return EraseCharHead(str,
" \t\n");
688inline std::string EraseEndl(std::string_view str)
693 size_t i = str.size() - 1;
696 if (str[i] !=
'\n' && str[i] !=
'\r')
699 return { str.data(), str.data() + i + 1 };
705inline std::string GetUtf8ByWchar(
wchar_t wc,
size_t offset = 0)
708 std::u32string s{ (char32_t)(wc + offset) };
742std::string Sprintf(
const char* format, ...);
748std::string SplitIntegerToThousands(
T integer)
756inline std::vector<std::string> Split(
const std::string& str,
char d)
758 std::vector<std::string> ret;
762inline std::vector<std::string_view> SplitView(std::string_view str,
char d)
764 std::vector<std::string_view> ret;
772inline std::vector<std::string> Split(
const std::string& str,
const std::string& d)
774 std::vector<std::string> ret;
778inline std::vector<std::string_view> SplitView(std::string_view str, std::string_view d)
780 std::vector<std::string_view> ret;
788inline std::vector<std::string> SplitNoEmpty(
const std::string& str,
char d)
790 std::vector<std::string> ret;
798inline std::vector<std::string_view> SplitViewNoEmpty(std::string_view str,
char d)
800 std::vector<std::string_view> ret;
812inline std::vector<std::string_view> SplitViewNoEmpty(std::string_view str, std::string_view vec_ch)
814 std::vector<std::string_view> ret;
817 for (; cur < str.size(); ++cur)
822 ret.push_back({ str.data() + beg, str.data() + cur });
827 ret.push_back({ str.data() + beg, str.data() + cur });
830inline std::vector<std::string_view> SplitViewNoEmpty(std::string_view str,
831 const std::vector<char>& vec_ch)
833 return SplitViewNoEmpty(str, std::string_view{ vec_ch.data(), vec_ch.size() });
875inline void EraseExtension(std::string& path_name)
878 path_name.pop_back();
881inline std::string EraseExtension(std::string_view path_name)
883 std::string ret = std::string{ path_name };
894inline void ReplaceExtension(std::string& path_name, std::string_view fmt)
902 path_name += std::string{ fmt };
905inline std::string ReplaceExtension(std::string_view path_name, std::string_view fmt)
907 std::string ret = std::string{ path_name };
908 ReplaceExtension(ret, fmt);
916inline void EraseFilename(std::string& path_name)
922inline std::string EraseFilename(std::string_view path_name)
924 std::string ret = std::string{ path_name };
932inline std::string GetFileStem(std::string_view path_name)
934 std::string name{ path_name };
943inline std::string ErasePath(std::string_view path_name, std::string_view path)
945 std::string ret{ path_name };
956inline bool IsRelativePath(std::string_view path_name)
958 if (path_name.empty())
961 if (path_name[0] ==
'/')
964 size_t len = (std::min)(path_name.size(), (
size_t)12);
965 for (
size_t i = 0; i < len; ++i)
967 if (path_name[i] ==
':')
984 std::string_view path_root, std::string_view path_name,
985 std::string& path_real, std::string& res_name,
986 std::string_view name =
"");
994std::string GetResName(
995 std::string_view path_root,
996 std::string_view path_name);
1005std::string CvtRelativePath(std::string path_cur, std::string_view path);
1011inline void CvtPathSeparator(std::string& path)
1016inline std::string CvtPathSeparator(std::string_view path)
1018 std::string ret{ path };
1019 CvtPathSeparator(ret);
1026inline void CvtPathSeparatorBack(std::string& path)
1031inline std::string CvtPathSeparatorBack(std::string_view path)
1033 std::string ret{ path };
1034 CvtPathSeparatorBack(ret);
1041inline std::string CvtLineBreak(std::string_view str)
1044 for (
auto& iter : str)
1048 ret.push_back(iter);
1057inline bool HasNumber(std::string_view str)
1065inline bool HasLetter(std::string_view str)
1073std::vector<std::string> ParseCommand(std::string_view cmd);
1079template<
size_t W,
size_t H>
1080Array<std::string, H> FormatString2(
const Array2<std::string, W, H>& arr)
1083 Array<size_t, W> mul_col{};
1084 for (
size_t j = 0; j <
H; ++j)
1086 for (
size_t i = 0; i <
W; ++i)
1088 if (arr[j][i].size() > mul_col[i])
1089 mul_col[i] = arr[j][i].size();
1093 Array<std::string, H> ret;
1094 for (
size_t i = 0; i <
W; ++i)
1096 std::string fmt = std::string(
"{:<") + std::to_string(mul_col[i] + 1) +
"}";
1097 for (
size_t j = 0; j <
H; ++j)
1099 ret[j] += fmt::vformat(fmt, fmt::make_format_args(arr[j][i]));
1109std::vector<std::string> FormatString2(
const Vector2<std::string>& arr);
1115inline std::string_view GetBeginUntilNumber(std::string_view str)
1118 while (i < str.size() && !std::isdigit((
unsigned char)str[i]))
1122 return str.substr(0, i);
1126inline bool IsSub(std::string_view str, std::string_view str_sub)
1131inline bool IsBegin(std::string_view str, std::string_view str_sub)
1135inline std::string_view
Range(std::string_view str,
char a,
char b)