哪里有网站建设企业,保定网站建设价格低,网站建设 国外,营销网络世界地图From: http://www.cnblogs.com/WuErPIng/archive/2005/04/21/142308.html 概述 std::string是个很不错的东东#xff0c;但实际使用时基本在每个程序里都会遇到不愉快的事情#xff1a;格式化字符串。我甚至由于这个原因在代码里引入平台有关的MFC#xff0c;ATL等本…From: http://www.cnblogs.com/WuErPIng/archive/2005/04/21/142308.html 概述 std::string是个很不错的东东但实际使用时基本在每个程序里都会遇到不愉快的事情格式化字符串。我甚至由于这个原因在代码里引入平台有关的MFCATL等本来不需要在项目中使用的一些重量级的框架就为了能轻松的做格式化字符串 :-) 。曾尝试过将ATL::CString的format函数提取出来使用但ATL::CString的底层调用了windows独有函数无法跨越平台。当然现在有了boost::format我们不用再担心了。boost::format重载了%操作符通过多次调用%操作符就能将参数非常方便格式化成字符串并实现了ATL::CString和C#中的string两者的格式化字符串功能。除了语法刚开始感觉到怪异功能足以让人感觉到兴奋 一、boost::format工作的方式 基本的语法boost::format( format-string ) % arg1 % arg2 % ... % argN 下面的例子说明boost::format简单的工作方式 // 方式一 cout boost::format(%s) % 输出内容 endl; // 方式二 std::string s; s str( boost::format(%s) % 输出内容 ); cout s endl; // 方式三 boost::format formater(%s); formater % 输出内容; std::string s formater.str(); cout s endl; // 方式四 cout boost::format(%1%) % boost::io::group(hex, showbase, 40) endl; 二、boost::format实际使用的实例 格式化语法 [ N$ ] [ flags ] [ width ] [ . precision ] type-char // ATL::CString风格 cout boost::format(\n\n%s %1t 十进制 [%d]\n %1t 格式化的十进制 [%5d]\n %1t 格式化十进制前补0 [%05d]\n %1t 十六进制 [%x]\n %1t 八进制 [%o]\n %1t 浮点 [%f]\n %1t 格式化的浮点 [%3.3f]\n %1t 科学计数 [%e]\n ) % example :\n % 15 % 15 % 15 % 15 % 15 % 15.01 % 15.01 % 15.01 endl; // C#::string风格 cout boost::format(%1% %1t 十进制 [%2$d]\n %1t 格式化的十进制 [%2$5d]\n %1t 格式化十进制前补0 [%2$05d]\n %1t 十六进制 [%2$x]\n %1t 八进制 [%2$o]\n %1t 浮点 [%3$f]\n %1t 格式化的浮点 [%3$3.3f]\n %1t 科学计数 [%3$e]\n ) % example :\n % 15 % 15.01 endl; 输出结果 /* example : 十进制 [15] 格式化的十进制 [ 15] 格式化十进制前补0 [00015] 十六进制 [f] 八进制 [17] 浮点 [15.010000] 格式化的浮点 [15.010] 科学计数 [1.501000e001] */ 三、boost::format新的格式说明符 %{nt} 当n是正数时插入n个绝对制表符 cout boost::format([%10t]) endl; %{nTX} 使用X做为填充字符代替当前流的填充字符一般缺省是一个空格 cout boost::format([%10T*]) endl;
四、异常处理 一般写法 try { cout boost::format(%d%d) % 1 endl; } catch(std::exception const e) { cout e.what() endl; // 输出内容 // boost::too_few_args: format-string refered to more arguments than were passed } boost::format的文档中有选择处理异常的办法不过个人感觉实用性可能不强下面是文档中的例子 // boost::io::all_error_bits selects all errors // boost::io::too_many_args_bit selects errors due to passing too many arguments. // boost::io::too_few_args_bit selects errors due to asking for the srting result before all arguments are passed boost::format my_fmt(const std::string f_string) { using namespace boost::io; format fmter(f_string); fmter.exceptions( all_error_bits ^ ( too_many_args_bit | too_few_args_bit ) ); return fmter; } cout my_fmt( %1% %2% \n) % 1 % 2 % 3 % 4 % 5; 五、还有其它一些功能但暂时感觉派不上用处就不去深究了。