设为首页 加入收藏

TOP

扩展C++ string类(二)
2014-11-23 22:00:01 来源: 作者: 【 】 浏览:29
Tags:扩展 string
turn *this;
size_type index;
while ( (index = find(oldStr)) != npos )
_Mybase::replace(index, oldStr.size(), newStr);
return *this;
}


//删除左边所有包含在target中的字符
_Myt& trimLeft(const _Myt& target)
{
while (!empty() && (target.find(*begin()) != npos))
erase(begin());
return *this;
}


//删除右边所有包含在target中的字符
_Myt& trimRight(const _Myt& target)
{
while (!empty() && target.find(*rbegin()) != npos)
erase(--end());
return *this;
}


//返回左边count个字符,count大于总长度则返回整个字符串
_Myt left(size_type count) const
{
return substr( 0, count );
}


//返回右边count个字符,count大于总长度则返回整个字符串
_Myt right(size_type count) const
{
return substr( _Mysize < count 0 : _Mysize - count );
}


//忽略大小写判断两个字符串是否相等
int compareNoCase(const _Myt& rhs) const
{
return toLower().compare(rhs.toLower());
}


//判断字符串是否以制定字符串开头
bool beginWith(const _Myt& rhs) const
{
return find(rhs) == size_type(0);
}


//判断字符串是否以制定字符串结尾
bool endWith(const _Myt& rhs) const
{
if(rhs.size() > _Mysize)
return false;
return compare(_Mysize - rhs.size(), rhs.size(), rhs) == 0;
}
#pragma endregion //general operation



#pragma region "convert between numbers"

//将字符串转为数字
//base:进制数。可以为8,10,16,如果其它值则强制为10。浮点数则忽略此参数
template
T toNumber (int base = 10) const
{
T t = T();
basic_stringstream<_Elem, _Traits, _Ax> ss(_Myptr());
return ConvertToNumber<_Elem, _Traits, _Ax>(ss, t, base);
}


//将整数转化为字符串
//base:进制数。可以为8,10,16,如果其它值则强制为10
template
static _Myt fromNumber ( T number, int base = 10 )
{
basic_stringstream<_Elem, _Traits, _Ax> ss;
ss.setf(BaseFlag(base), ios_base::basefield);
ss << number;
return ss.str();
}


//将float转化为字符串
//f:格式化参数。可以为'f','e','E','g','G'。'f'为定点数,'e'或'E'表示科学计数法
// 'g'或‘G’表示格式化为定点数或科学计数法,看哪一个表示方便。
//prec:小数点后的位数(定点数表示法)或总的有效位数(科学计数法)
static _Myt fromNumber ( float number, _Elem f = _Elem('g'), int prec = 6 )
{
return fromNumber(static_cast(number), f, prec);
}


//将double转化为字符串,参数解释同上
static _Myt fromNumber ( double number, _Elem f = _Elem('g'), int prec = 6 )
{
basic_stringstream<_Elem, _Traits, _Ax> ss;
ss << setprecision(prec);
if ( _Traits::eq(f, _Elem('f')) )
ss << setiosflags(ios_base::fixed);
else if ( _Traits::eq(f, _Elem('e')) || _Traits::eq(f, _Elem('E')) )
ss << setiosflags(ios_base::scientific);
ss << number;
return ss.str();
}
#pragma endregion //convert between numbers



#pragma region "format string"


//将szFormat格式化为字符串,参数解释同sprintf
void format(const _Elem* szFormat, ...)
{
if(!szFormat)
return;
va_list argList;
va_start(argList, szFormat);
formatV(szFormat, argList);
va_end(argList);
}


//将szFormat格式化为字符串,参数解释同sprintf
void formatV(const _Elem* szFormat, va_list argList)
{
if(!szFormat)
return;
int nLength = _ExTraits::ct_vscprintf(szFormat, argList);
if(nLength < 0)
return;
resize(nLength);
_ExTraits::ct_vstprintf_s(_Myptr(), nLength + 1, szFormat, argList);
va_end(argList);
}
#pragma endregion //format string
};


typedef basic_exstring,
allocator, ex_char_traits > exstring;


typedef basic_exstring,
allocator, ex_char_traits > exwstring;


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux中实现对输入的异步 下一篇Android中的动画详解系列

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: