zoukankan      html  css  js  c++  java
  • 软件架构设计之Utility模块——string

    YKString类是对STL 中的std::wstring的功能扩展,没有什么好解释的了,就直接看代码吧。

    头文件:

    class YKString : public std::wstring
    {
    public:
    	typedef std::wstring::size_type	size_type;
    
    	YKString() : std::wstring() {}
    	YKString(const std::wstring& str, size_type pos = 0, size_type n = npos)
    		: std::wstring(str, pos, n) {}
    	YKString(const value_type* str) : std::wstring(str) {}
    	YKString(const value_type* str, size_type n) : std::wstring(str, n) {}
    	YKString(size_type n, value_type val) : std::wstring(n, val) {}
    	YKString(value_type ch) : std::wstring(1, ch) {}
    	YKString(const std::string& str) { Assign(str.c_str()); }
    	YKString(const YK_CHAR* str) { Assign(str); }
    
    	template <class InputIter>
    	YKString(InputIter fIter, InputIter lIter) : std::wstring(fIter, lIter) { }
    
    	~YKString() {}
    
    	YKString& operator= (const value_type str)
    	{ assign(1, str); return *this; }
    	YKString& operator= (const value_type* str)
    	{ assign(str); return *this; }
    	YKString& operator= (const std::wstring& str)
    	{ assign(str.c_str()); return *this; }
    	YKString& operator= (const std::string& str)
    	{ Assign(str.c_str()); return *this; }
    	YKString& operator= (const YK_CHAR* str)
    	{ Assign(str); return *this; }
    
    	YKString& operator+= (const YKString& str) 
    	{ return (*this += str.c_str());}
    	YKString& operator+= (const value_type* str)
    	{ append(str); return *this; }
    
    //////////////////////////////////////////////////////////////////////////
    //	非变更操作
    
    	// 指定pos的字符是否为小写字母、pos==npos则是否全为小写字母
    	YK_BOOL IsLower(size_type pos = npos) const;
    	// 指定pos的字符是否为大写字母、pos==npos则是否全为大写字母
    	YK_BOOL IsUpper(size_type pos = npos) const;
    	// 指定pos的字符是否为数字、pos==npos则是否全为数字
    	YK_BOOL IsNumeric(size_type pos = npos) const;
    	// 指定pos的字符是否为字母(不分大小写)、pos==npos则是否全为字母(不分大小写)
    	YK_BOOL IsAlpha(size_type pos = npos) const;
    	// 指定pos的字符是否为字母或数字、pos==npos则是否全为字母或数字
    	YK_BOOL IsAlnum(size_type pos = npos) const;
    	// 指定pos的字符是否为空白字符、pos==npos则是否全为空白字符
    	YK_BOOL IsBlank(size_type pos = npos) const;
    	// 忽略大小写的比较两个字符串
    	YK_INT iCompare(const YKString& rhs) const;
    
    	// know-C++
    	// 意义是将*this设置为const,即将this指针指向用来调用该成员函数的对象设置为const,那么该成员函数不可以修改这个对象
    	// const成员函数只能调用const成员函数,不能调用非const成员函数
    	// const成员函数可以调用成员变量,但是不能修改成员变量
    	// const成员函数可以修改mutable修饰的成员变量;如果成员变量是指针的话,可以修改指针指向的变量的值
    
    //////////////////////////////////////////////////////////////////////////
    //	变更操作
    
    
    	// 将字母全转为小写
    	YKString& ToLower();
    	// 将字母全转为大写
    	YKString& ToUpper();
    	// 以rVal替换所有lVal字符串
    	YKString& Replace(const YKString& lVal, const YKString& rVal);
    	// 去除字符串左边的空白字符
    	void TrimLeft();
    	// 去除字符串右边的空白字符
    	void TrimRight();
    	// 去除字符串左右两边的空白字符
    	void Trim();
    
    	// 字符串追加指定类型的值,precision为double型的精度
    	template <typename T>
    	void Append(T val, size_type precision = 0) {
    		append(Format(val, precision).c_str());
    	}
    
    //////////////////////////////////////////////////////////////////////////
    /// 查找
    
    	// 为find_first_of的忽略大小写版本
    	size_type ifind_first_of(const YKString& str, size_type off = 0, size_type count = 0);
    	// 为find_first_not_of的忽略大小写版本
    	size_type ifind_first_not_of();
    	// 为find_last_of的忽略大小写版本
    	size_type ifind_last_of();
    	// 为find_last_not_of的忽略大小写版本
    	size_type ifind_last_not_of();
    	// 
    	size_type find_nth();
    	size_type ifind_nth();
    	YKString find_head(const YKString& sep) const;
    	YKString find_tail(const YKString& sep) const;
    
    //////////////////////////////////////////////////////////////////////////
    // 高级操作
    
    	// 转换为string
    	std::string ToString() const;
    
    	// 将容器内的内容以sep字符串作为分隔符拼接
    	// bPair = false,格式形如:XXXwstrSepXXX
    	// bPari = true,格式形如:XXXwstrSepXXXwstrSep
    	template <typename T>
    	static YKString Join(const T& container, const YKString& sep, YK_BOOL bPair = false) {
    		T::const_iterator fIter = container.begin();
    		T::const_iterator lIter = container.end();
    		return Join(fIter, lIter, sep, bPair);
    	}
    	// 将迭代器内的内容以sep字符串作为分隔符拼接
    	// bPair = false,格式形如:XXXwstrSepXXX
    	// bPari = true,格式形如:XXXwstrSepXXXwstrSep
    	template <typename InputIter>
    	static YKString Join(InputIter fIter, InputIter lIter, const YKString& sep, YK_BOOL bPair = false) {
    		YKString strRt;
    		for (; fIter != lIter; ++fIter)
    		{
    			strRt.Append(*fIter);
    			strRt.append(sep.c_str());
    		}
    		if (false == bPair && !strRt.empty())
    		{
    			strRt.erase(strRt.length() - sep.length());
    		}
    
    		return strRt;
    	}
    
    	// 将以sep分隔的字符串分解到vector容器中
    	template <typename T>
    	std::vector<T> Parse(const YKString& sep) const {
    		std::vector<T> vecVal;
    		size_type idxPre = 0;
    		size_type idx = find(sep.c_str());
    		while (idx != YKString::npos)
    		{
    			YKString strTemp = substr(idxPre, idx-idxPre);
    			vecVal.push_back(strTemp.Convert<T>());
    			idx += sep.size();
    			idxPre = idx;
    			idx = find(sep, idx);
    		}
    
    		if (idxPre <= size() - sep.size())
    		{
    			YKString strTemp = substr(idxPre);
    			vecVal.push_back(strTemp.Convert<T>());
    		}
    
    		return vecVal;
    	}
    
    	// 将值转换为YKString,可指定浮点数的格式化精度
    	template <typename T>
    	static YKString Format(T val, size_type precision = 0) {
    		std::wostringstream stream;
    		if (precision > 0)
    		{
    			stream.precision(precision);
    			stream.flags(std::wostringstream::fixed);
    		}
    		stream << val;
    		return YKString(stream.str());
    	}
    
    	// 数字转为YKString,按宽度格式化,左边填充0
    	static YKString FormatDigit(YK_LONG val, size_type width);
    
    	// 将字符串里内容转换为指定的类型
    	template <typename T>
    	T Convert() const {
    		try
    		{
    			return boost::lexical_cast<T>(c_str());
    		}
    		catch (boost::bad_lexical_cast&)
    		{
    			if (!empty())	// 字符串内存在不符合指定类型的字符
    				assert(0);
    
    			return T();	// 空字符串返回类型的默认值
    		}
    	}
    
    	// 将字符串里的RGB转换为整形值,字符串内容形式要求:(RGB(xxx,xxx,xxx))
    	YK_ULONG ConvertRGB();
    
    private:
    	void Assign(const YK_CHAR* pChar);
    
    };

    实现文件:

    YK_BOOL YKString::IsLower( size_type pos /* = npos */ ) const
    {
    	if (empty())
    		return false;
    
    	if (pos == npos)
    	{
    		for (const_iterator i = begin(); i != end(); ++i)
    		{
    			if (!std::islower(*i, std::locale()))
    				return false;
    		}
    	}
    	else
    	{
    		YKString strTemp = at(pos);
    		return strTemp.IsLower();
    	}
    
    	return true;
    }
    
    YK_BOOL YKString::IsUpper( size_type pos /* = npos */ ) const
    {
    	if (empty())
    		return false;
    
    	if (pos == npos)
    	{
    		for (const_iterator i = begin(); i != end(); ++i)
    		{
    			if (!std::isupper(*i, std::locale()))
    				return false;
    		}
    	}
    	else
    	{
    		YKString strTemp = at(pos);
    		return strTemp.IsUpper();
    	}
    
    	return true;
    }
    
    YK_BOOL YKString::IsNumeric( size_type pos /* = npos */ ) const
    {
    	if (empty())
    		return false;
    
    	if (pos == npos)
    	{
    		for (const_iterator i = begin(); i != end(); ++i)
    		{
    			if (!std::isdigit(*i, std::locale()))
    				return false;
    		}
    	}
    	else
    	{
    		YKString strTemp = at(pos);
    		return strTemp.IsNumeric();
    	}
    
    	return true;
    }
    
    YK_BOOL YKString::IsAlpha( size_type pos /* = npos */ ) const 
    {
    	if (empty())
    		return false;
    
    	if (pos == npos)
    	{
    		for (const_iterator i = begin(); i != end(); ++i)
    		{
    			if (!std::isalpha(*i, std::locale()))
    				return false;
    		}
    	}
    	else
    	{
    		YKString strTemp = at(pos);
    		return strTemp.IsAlpha();
    	}
    
    	return true;
    }
    
    YK_BOOL YKString::IsAlnum( size_type pos /* = npos */ ) const
    {
    	if (empty())
    		return false;
    
    	if (pos == npos)
    	{
    		for (const_iterator i = begin(); i != end(); ++i)
    		{
    			if (!std::isalnum(*i, std::locale()))
    				return false;
    		}
    	}
    	else
    	{
    		YKString strTemp = at(pos);
    		return strTemp.IsAlnum();
    	}
    
    	return true;
    }
    
    YK_BOOL YKString::IsBlank( size_type pos /* = npos */ ) const
    {
    	if (empty())
    		return false;
    
    	if (pos == npos)
    	{
    		for (const_iterator i = begin(); i != end(); ++i)
    		{
    			if (!std::isblank(*i, std::locale()))
    				return false;
    		}
    	}
    	else
    	{
    		YKString strTemp = at(pos);
    		return strTemp.IsBlank();
    	}
    
    	return true;
    }
    
    YK_INT YKString::iCompare( const YKString& rhs ) const
    {
    	const_iterator iter = begin();
    	const_iterator iterEnd = end();
    	const_iterator iterRhs = rhs.begin();
    	const_iterator iterRhsEnd = rhs.end();
    	while (iter != iterEnd && iterRhs != iterRhsEnd)
    	{
    		value_type c1(std::tolower(*iter, std::locale()));
    		value_type c2(std::tolower(*iterRhs, std::locale()));
    		if (c1 < c2)
    			return -1;
    		else if (c1 > c2)
    			return 1;
    		++iter; ++iterRhs;
    	}
    
    	if (iter == iterEnd)
    		return iterRhs == iterRhsEnd ? 0 : -1;
    
    	return 1;
    }
    
    YKString& YKString::ToLower()
    {
    	for (iterator i = begin(); i != end(); ++i)
    	{
    		*i = std::tolower(*i, std::locale());
    	}
    
    	return *this;
    }
    
    YKString& YKString::ToUpper()
    {
    	for (iterator i = begin(); i != end(); ++i)
    	{
    		*i = std::toupper(*i, std::locale());
    	}
    
    	return *this;
    }
    
    YKString& YKString::Replace( const YKString& lVal, const YKString& rVal )
    {
    	size_type lastpos = 0, thispos;
    	while ((thispos = find(lVal, lastpos)) != npos)
    	{
    		replace(thispos, lVal.size(), rVal);
    		lastpos = thispos + rVal.size();
    	}
    	return *this;
    }
    
    void YKString::TrimLeft()
    {
    	const_iterator i = begin();
    	for (; i != end(); ++i)
    	{
    		if (!std::isspace(*i, std::locale()))
    			break;
    	}
    
    	erase(begin(), i);
    }
    
    void YKString::TrimRight()
    {
    	const_reverse_iterator ri = rbegin();
    	for (; ri != rend(); ++ri)
    	{
    		if (!std::isspace(*ri, std::locale()))
    			break;
    	}
    
    	erase(rbegin().base(), ri.base());
    }
    
    void YKString::Trim()
    {
    	TrimLeft();
    	TrimRight();
    }
    
    YKString::size_type YKString::ifind_first_of(const YKString& str, size_type off /* = 0 */, size_type count /* = 0 */)
    {
    	YKString temp = str;
    	temp.ToLower();
    	count = count > 0 ? count : temp.length();
    	return find_first_of(temp.c_str(), off, count);
    }
    
    YKString::size_type YKString::ifind_first_not_of()
    {
    	return 0;
    }
    
    YKString::size_type YKString::ifind_last_of()
    {
    	return 0;
    }
    
    YKString::size_type YKString::ifind_last_not_of()
    {
    	return 0;
    }
    
    YKString::size_type YKString::find_nth()
    {
    	return 0;
    }
    
    YKString::size_type YKString::ifind_nth()
    {
    	return 0;
    }
    
    YKString YKString::find_head(const YKString& sep) const
    {
    	size_type pos = find(sep.c_str());
    	if (pos != YKString::npos)
    	{
    		return std::move(substr(0, pos));
    	}
    	return L"";
    }
    
    YKString YKString::find_tail(const YKString& sep) const
    {
    	size_type pos = find_last_of(sep.c_str());
    	if (pos != YKString::npos)
    	{
    		return std::move(substr(pos+sep.size()));
    	}
    	return L"";
    }
    
    YKString YKString::FormatDigit( YK_LONG val, size_type width )
    {
    	YKBuffer<YK_WCHAR> temp(20);
    	YKString str = L"%0";
    	str += YKString::Format(width);
    	str += L"d";
    	swprintf(temp.Begin(), temp.Size(), str.c_str(), val);
    	return temp.Begin();
    }
    
    YK_ULONG YKString::ConvertRGB()
    {
    	YK_ULONG rgbVal = 0;
    	size_type fPos = find(L'(');
    	size_type lPos = find(L')');
    	if (fPos != npos && lPos != npos)
    	{
    		YKString strVal = substr(fPos+1, lPos-fPos-1);
    		std::vector<YK_ULONG> vecVal = strVal.Parse<YK_ULONG>(L",");
    		if (vecVal.size() == 3)
    		{
    // #ifdef _MSC_VER && _WINDOWS
    // 			rgbVal = RGB(vecVal[0], vecVal[1], vecVal[2]);
    // #endif // _MSC_VER
    		}
    	}
    
    	return rgbVal;
    }
    
    std::string YKString::ToString() const
    {
    	size_t size = this->size();
    	YKBuffer<YK_CHAR> buff(size+1);
    	size_t rtValue = 0;
    	wcstombs_s(&rtValue, buff.Begin(), size+1, c_str(), YK_UINT_MAX);
    	buff[size] = 0;
    	return buff.Begin();
    }
    
    void YKString::Assign( const YK_CHAR* pChar )
    {
    	size_t size = strlen(pChar);
    	YKBuffer<YK_WCHAR> buff(size+1);
    	size_t rtValue = 0;
    	mbstowcs_s(&rtValue, buff.Begin(), size+1, pChar,  YK_UINT_MAX);
    	buff[size] = 0x00;
    	assign(buff.Begin());
    }


  • 相关阅读:
    ACM2023
    Archlinux系统运维
    Apache2配置腾讯云SSL证书
    奇异值分解SVD
    剑指offer-不用加减乘除做加法
    负载均衡与缓存
    leetcode简单题6
    python 函数
    Mac-常用命令与快捷键
    GOM通区插件-支持GOM绝对路径-读取配置项-分割字符等功能。不定期更新
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/2979600.html
Copyright © 2011-2022 走看看