Self-realization of string formatting in STL 2

str.hpp

#include <stdarg.h>
#include <string>
#include <vector>
#include <cassert>
/*	STL中的string和wstring的格式化方法之二	*/
#ifndef __STR_STR_HPP_INCLUDED_
#define __STR_STR_HPP_INCLUDED_
namespace str
{
    //字符串格式化函数
    std::string format(const char *fmt, ...) 
    { 
        std::string strResult="";
        if (NULL != fmt)
        {
            va_list marker = NULL;            
            va_start(marker, fmt);                            //初始化变量参数 
            size_t nLength = _vscprintf(fmt, marker) + 1;    //获取格式化字符串长度
            std::vector<char> vBuffer(nLength, '\0');        //创建用于存储格式化字符串的字符数组
            int nWritten = _vsnprintf_s(&vBuffer[0], vBuffer.size(), nLength, fmt, marker);
            if (nWritten>0)
            {
                strResult = &vBuffer[0];
            }            
            va_end(marker);                                    //重置变量参数
        }
        return strResult; 
    }
    //字符串格式化函数
    std::wstring format(const wchar_t *fmt, ...) 
    { 
        std::wstring strResult=L"";
        if (NULL != fmt)
        {
            va_list marker = NULL;            
            va_start(marker, fmt);                            //初始化变量参数
            size_t nLength = _vscwprintf(fmt, marker) + 1;    //获取格式化字符串长度
            std::vector<wchar_t> vBuffer(nLength, L'\0');    //创建用于存储格式化字符串的字符数组
            int nWritten = _vsnwprintf_s(&vBuffer[0], vBuffer.size(), nLength, fmt, marker); 
            if (nWritten > 0)
            {
                strResult = &vBuffer[0];
            }
            va_end(marker);                                    //重置变量参数
        }
        return strResult; 
    } 
}
#endif

/*	STL中的string和wstring的格式化方法之一	*/

//最近开始使用STL,说实在的,用惯了MFC,突然用STL,真的很不习惯,在我用STL中的string类就卡住了好长时间。
//string没有CString::Format那样的方法,该怎么格式化字符串呢?可以这样做:

//#include <string>  
//#include <ostringstream>  

//#ifdef  _UNICODE  
//#define  tstring   wstring  
//#define tostringstream  wostringstream  
//#else  
//#define  tstring   string  
//#define tostringstream  ostringstream  
//#endif  

//tostringstream strStream;  
//tstring str;  
  
//strStream<< _T("The value of X is :")<< X <<endl;  
//str = strStream.str();  

//好了,这样就可以了。当你想把tstring 转为LPCTSTR时,必须调用c_str(),即LPCTSTR lpszString = str.c_str();  

test

// string_format.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <iostream>
#include <cassert>
#include "str.hpp"
int _tmain(int argc, _TCHAR* argv[])
{
    const double PI=3.1415926;
    std::string s=str::format("ANSI%s---字符:%c;整数:%d;双精度:%f", "测试",'a', 38, PI);
    std::cout<<s<<std::endl;

    std::wstring ws=str::format(L"UNICODE%s---字符:%c;整数:%d;双精度:%f", L"测试",'u', 83, PI);
	std::wcout.imbue(std::locale("chs"));// std::wcout想输出中文,需要加这句
    std::wcout<<ws<<std::endl;

    system("pause");
    return 0;
}



//Primary language			Sublanguage					Language string

//Chinese					Chinese						"chinese"
//Chinese					Chinese (simplified)		"chinese-simplified" or "chs"
//Chinese					Chinese (traditional)		"chinese-traditional" or "cht"
//Czech						Czech						"csy" or "czech"
//Danish					Danish						"dan" or "danish"
//Dutch						Dutch (default)				"dutch" or "nld"
//Dutch						Dutch (Belgium)				"belgian", "dutch-belgian", or "nlb"
//English					English (default)			"english"
//English					English (Australia)			"australian", "ena", or "english-aus"
//English					English (Canada)			"canadian", "enc", or "english-can"
//English					English (New Zealand)		"english-nz" or "enz"
//English					English (United Kingdom)	"eng", "english-uk", or "uk"
//English					English (United States)		"american", "american english", "american-english", "english-american", "english-us", "english-usa", "enu", "us", or "usa"
//Finnish					Finnish						"fin" or "finnish"
//French					French (default)			"fra" or "french"
//French					French (Belgium)			"frb" or "french-belgian"
//French					French (Canada)				"frc" or "french-canadian"
//French					French (Switzerland)		"french-swiss" or "frs"
//German					German (default)			"deu" or "german"
//German					German (Austria)			"dea" or "german-austrian"
//German					German (Switzerland)		"des", "german-swiss", or "swiss"
//Greek						Greek						"ell" or "greek"
//Hungarian					Hungarian					"hun" or "hungarian"
//Icelandic					Icelandic					"icelandic" or "isl"
//Italian					Italian (default)			"ita" or "italian"
//Italian					Italian (Switzerland)		"italian-swiss" or "its"
//Japanese					Japanese					"japanese" or "jpn"
//Korean					Korean						"kor" or "korean"
//Norwegian					Norwegian (default)			"norwegian"
//Norwegian					Norwegian (Bokmal)			"nor" or "norwegian-bokmal"
//Norwegian					Norwegian (Nynorsk)			"non" or "norwegian-nynorsk"
//Polish					Polish						"plk" or "polish"
//Portuguese				Portuguese (default)		"portuguese" or "ptg"
//Portuguese				Portuguese (Brazil)			"portuguese-brazilian" or "ptb"
//Russian					Russian (default)			"rus" or "russian"
//Slovak					Slovak						"sky" or "slovak"
//Spanish					Spanish (default)			"esp" or "spanish"
//Spanish					Spanish (Mexico)			"esm" or "spanish-mexican"
//Spanish					Spanish (Modern)			"esn" or "spanish-modern"
//Swedish					Swedish						"sve" or "swedish"
//Turkish					Turkish						"trk" or "turkish"

Guess you like

Origin blog.csdn.net/weixin_56819992/article/details/131043361