#pragma once #include #include #include #include #include #include class StringHelper { public: static bool Contains(std::string strSource ,char str) { if (strSource.find(str) != std::string::npos) { return true; } else { return false; } } static bool Contains(std::string strSource ,std::string str) { if (strSource.find(str) != std::string::npos) { return true; } else { return false; } } static bool Contains(std::vector& strSource, std::string str) { if (std::find(strSource.begin(), strSource.end(), str) == strSource.end()) { return false; } return true; } static bool Contains(std::vector& strSource, QString& str) { return std::find(strSource.begin(), strSource.end(), str) != strSource.end(); } static std::string toLower(std::string source) { std::transform(source.begin(), source.end(), source.begin(), [](unsigned char c){ return std::tolower(c); }); return source; } static std::string toUpper(std::string source) { std::transform(source.begin(), source.end(), source.begin(), [](unsigned char c){ return std::toupper(c); }); return source; } static std::string trimStart(std::string source, const std::string &trimChars = " \t\n\r\v\f") { return source.erase(0, source.find_first_not_of(trimChars)); } static std::string trimEnd(std::string source, const std::string &trimChars = " \t\n\r\v\f") { return source.erase(source.find_last_not_of(trimChars) + 1); } static std::string trim(std::string source, const std::string &trimChars = " \t\n\r\v\f") { return trimStart(trimEnd(source, trimChars), trimChars); } static std::string replace(std::string source, const std::string &find, const std::string &replace) { std::size_t pos = 0; while ((pos = source.find(find, pos)) != std::string::npos) { source.replace(pos, find.length(), replace); pos += replace.length(); } return source; } static bool startsWith(const std::string &source, const std::string &value) { if (source.length() < value.length()) return false; else return source.compare(0, value.length(), value) == 0; } static bool endsWith(const std::string &source, const std::string &value) { if (source.length() < value.length()) return false; else return source.compare(source.length() - value.length(), value.length(), value) == 0; } static std::vector split(const std::string& str, char delimiter) { std::vector tokens; std::string token; std::stringstream ss(str); while (std::getline(ss, token, delimiter)) { tokens.push_back(token); } return tokens; } static std::vector split(const std::string &source, const std::vector &delimiters) { std::vector output; std::string temp = source; while (!temp.empty()) { size_t minPos = std::string::npos; std::string foundDelim; // 找到最先出现的分隔符 for (const auto &delim : delimiters) { size_t pos = temp.find(delim); if (pos != std::string::npos && pos < minPos) { minPos = pos; foundDelim = delim; } } // 如果找到分隔符 if (minPos != std::string::npos) { if (minPos > 0) // 确保不会加入空字符串 { output.push_back(temp.substr(0, minPos)); } temp = temp.substr(minPos + foundDelim.length()); // 跳过分隔符 } else { output.push_back(temp); break; } } return output; } template static std::string toString(const T &subject) { std::ostringstream ss; ss << subject; return ss.str(); } template static std::string tostring_fix(const T &subject,int setpre) { std::ostringstream oss; oss << std::fixed << std::setprecision(setpre) << subject; // 获取格式化后的字符串 std::string formattedString = oss.str(); return formattedString; } template static T fromString(const std::string &subject) { std::wistringstream ss(subject); T target; ss >> target; return target; } static bool isEmptyOrWhiteSpace(const std::string &source) { if (source.length() == 0) return true; else { for (std::size_t index = 0; index < source.length(); index++) { if (!std::isspace(source[index])) return false; } return true; } } static std::vector GetWords(const std::string& str, const std::vector& splitter = {"(", ")"}) { std::vector list; std::vector words; std::istringstream stream(str); std::string word; // 按空格和逗号拆分字符串 while (stream >> word) { words.push_back(word); } bool bracketOn = false; std::string bracket; for (const auto& word : words) { if (word.find(splitter[0]) != std::string::npos && word.find(splitter[1]) != std::string::npos && !bracketOn) { list.push_back(word); // 括号都在同一个单词里,直接加入 } else if (word.find(splitter[0]) != std::string::npos && !bracketOn) { bracket = word + " "; bracketOn = true; } else if (word.find(splitter[1]) != std::string::npos && bracketOn) { bracket += word; list.push_back(bracket); bracketOn = false; } else { if (word.find(splitter[0]) != std::string::npos || word.find(splitter[1]) != std::string::npos) { throw std::runtime_error("行中存在无法解析的分词,请检查是否缺少空格等分隔符."); } if (bracketOn) { bracket += word + " "; } else { list.push_back(word); } } } return list; } static std::string FirstWord(const std::string& str) { std::string word = str; word.erase(0, word.find_first_not_of(" \t\n\r")); word.erase(word.find_last_not_of(" \t\n\r") + 1); size_t index = word.find(' '); if (index == std::string::npos) { return word; } return word.substr(0, index); } static double roundToNDecimalPlaces(double value, int n) { double factor = std::pow(10, n); // 计算 10 的 n 次方 return std::round(value * factor) / factor; // 四舍五入到 n 位小数 } static std::string formatToString(double value,int dot) { std::stringstream ss; ss << std::fixed << std::setprecision(dot) << value; return ss.str(); } // 去除字符串头部和尾部的空白字符 static std::string trimStartEnd(const std::string& str) { // 去除左边的空白字符 size_t start = str.find_first_not_of(" \t\n\r\f\v"); if (start == std::string::npos) { return ""; // 如果全是空白字符,返回空字符串 } // 去除右边的空白字符 size_t end = str.find_last_not_of(" \t\n\r\f\v"); // 使用substr提取头尾去除空白后的子字符串 return str.substr(start, end - start + 1); } static void removeLeadingNewlines(std::string& str) { // 基本情况:如果字符串为空或第一个字符不是 '\n',停止递归 if (str.empty() || str.front() != '\n') { return; } // 递归调用,删除第一个 '\n' str.erase(0, 1); removeLeadingNewlines(str); } static bool IsNullOrEmptyAfterTrim(const std::string& str) { return str.empty() || str.find_first_not_of(" \t") == std::string::npos; } };