一个简单的类,用于将数字转换为带有千位分隔符的字符串






4.18/5 (9投票s)
一个简单的类,用于将数值转换为带有本地化千位分隔符的字符串。
引言
这个 CTextNumber
类我已经用了好几年了。几乎在我参与的每个项目中都用到了它。最近,我发现自己正在更新 CTextNumber
,于是我决定顺便分享一下。它仍然是一个非常简单的实现,我希望其他人的代码审查能帮助加强它。
作为一个 C++ 代码示例,CTextNumber
展示了操作符重载的一个良好应用。
CTextNumber
通过使用 TCHAR
类型支持 UNICODE 和 MBCS 构建。CTextNumber
仅依赖于 RTL。通过对几行代码进行更改,CTextNumber
可以转换以在 CE 上运行。MFC 仅用于演示应用程序。
Using
提取下载内容后,您必须构建项目,然后运行其输出以查看工作示例。查看 txtnum.h 和 txtnum.cpp 文件以检查 CTextNumber
类。查看 testtextnum 子文件夹中的 testtextnumDlg.cpp,了解使用 CTextNumber
的示例。您可以将指针分配给静态的 CTextNumber::s_lpNumberFormat
成员来控制格式化。以下是演示应用程序中 InitDialog()
方法中的一个代码片段。对话框类将 m_lbNumbers
定义为 MFC 的 CListBox
。
// Setup for locale... you only have to do this once. numberformat = {0}; TCHAR bufILZero[3] = {0}; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ILZERO, bufILZero, 3); numberformat.LeadingZero = _ttoi(bufILZero); TCHAR bufINegNum[3] = {0}; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_INEGNUMBER, bufINegNum, 3); numberformat.NegativeOrder = _ttoi(bufINegNum); numberformat.Grouping = 3; TCHAR bufSThousands[5] = {0}; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, bufSThousands, 5); numberformat.lpThousandSep = bufSThousands; TCHAR bufSDecimal[5] = {0}; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, bufSDecimal, 5); numberformat.lpDecimalSep = bufSDecimal; numberformat.NumDigits = 0; CTextNumber::s_lpNumberFormat = &numberformat; CString strOut; CTextNumber tn; // __int8 –128 to 127 // unsigned __int8 0 to 255 signed __int8 i8 = 0; tn = i8; strOut.Format(TEXT("INT8 value of 0 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i8 = 1; strOut.Format(TEXT("INT8 value of 1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i8 = -1; strOut.Format(TEXT("INT8 value of -1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i8 = SCHAR_MAX; strOut.Format(TEXT("INT8 value of SCHAR_MAX = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i8 = SCHAR_MIN; strOut.Format(TEXT("INT8 value of SCHAR_MIN = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); unsigned __int8 ui8 = 0; tn = ui8; strOut.Format(TEXT("UINT8 value of 0 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = ui8 = 1; strOut.Format(TEXT("UINT8 value of 1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = ui8 = -1; strOut.Format(TEXT("UINT8 value of -1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = ui8 = UCHAR_MAX; strOut.Format(TEXT("UINT8 value of UCHAR_MAX = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); // __int16 –32,768 to 32,767 // unsigned __int16 0 to 65,535 signed __int16 i16 = 0; tn = i16; strOut.Format(TEXT("INT16 value of 0 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i16 = 1; strOut.Format(TEXT("INT16 value of 1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i16 = -1; strOut.Format(TEXT("INT16 value of -1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i16 = SHRT_MAX; strOut.Format(TEXT("INT16 value of SHRT_MAX = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i16 = SHRT_MIN; strOut.Format(TEXT("INT16 value of SHRT_MIN = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); unsigned __int16 ui16 = 0; tn = ui16; strOut.Format(TEXT("UINT16 value of 0 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = ui16 = 1; strOut.Format(TEXT("UINT16 value of 1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = ui16 = -1; strOut.Format(TEXT("UINT16 value of -1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = ui16 = USHRT_MAX; strOut.Format(TEXT("UINT16 value of USHRT_MAX = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); // __int32 –2,147,483,648 to 2,147,483,647 // unsigned __int32 0 to 4,294,967,295 signed __int32 i32 = 0; tn = i32; strOut.Format(TEXT("INT32 value of 0 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i32 = 1; strOut.Format(TEXT("INT32 value of 1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i32 = -1; strOut.Format(TEXT("INT32 value of -1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i32 = LONG_MAX; strOut.Format(TEXT("INT32 value of LONG_MAX = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i32 = LONG_MIN; strOut.Format(TEXT("INT32 value of LONG_MIN = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); unsigned __int32 ui32 = 0; tn = ui32; strOut.Format(TEXT("UINT32 value of 0 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = ui32 = 1; strOut.Format(TEXT("UINT32 value of 1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = ui32 = -1; strOut.Format(TEXT("UINT32 value of -1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = ui32 = ULONG_MAX; strOut.Format(TEXT("UINT32 value of ULONG_MAX = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); // __int64 –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 // unsigned __int64 0 to 18446744073709551615 __int64 i64 = 0; tn = i64; strOut.Format(TEXT("INT64 value of 0 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i64 = 1; strOut.Format(TEXT("INT64 value of 1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i64 = -1; strOut.Format(TEXT("INT64 value of -1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i64 = _I64_MAX; strOut.Format(TEXT("INT64 value of _I64_MAX = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = i64 = _I64_MIN; strOut.Format(TEXT("INT64 value of _I64_MIN = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); unsigned __int64 u64 = 0; tn = u64; strOut.Format(TEXT("UINT64 value of 0 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = u64 = 1; strOut.Format(TEXT("UINT64 value of 1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = u64 = -1; strOut.Format(TEXT("UINT64 value of -1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = u64 = _UI64_MAX; strOut.Format(TEXT("UINT64 value of _UI64_MAX = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = u64 = 9999999999999999999; strOut.Format(TEXT("UINT64 value of " + "9999999999999999999 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = u64 = 0x8ac7230489e7ffff; strOut.Format(TEXT("UINT64 value " + "of 0x8ac7230489e7ffff = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); numberformat.NumDigits = 1; float fVal = 0.0f; tn = fVal; strOut.Format(TEXT("float value of 0.0 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); tn = fVal = 1.1f; strOut.Format(TEXT("float value of 1.1 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); numberformat.NumDigits = 2; tn = fVal = 11.11f; strOut.Format(TEXT("float value of 11.11 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); numberformat.NumDigits = 3; tn = fVal = 111.111f; strOut.Format(TEXT("float value of 111.111 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); numberformat.NumDigits = 4; tn = fVal = 1111.1111f; strOut.Format(TEXT("float value of 1111.1111 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); numberformat.NumDigits = 5; tn = fVal = 11111.11111f; strOut.Format(TEXT("float value of 11111.11111 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); numberformat.NumDigits = 6; tn = fVal = 111111.111111f; strOut.Format(TEXT("float value of 111111.111111 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); numberformat.NumDigits = 2; tn = fVal = 3.4E+38f; strOut.Format(TEXT("float value of 3.4E+38f = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); double dbVal = 0.0; tn = dbVal = 1.7E+308; strOut.Format(TEXT("double value of 1.7E+308 = %s"), tn.GetString()); m_lbNumbers.AddString(strOut); CString str; CSize sz; int dx = 0; CDC* pDC = m_lbNumbers.GetDC(); for(int i=0; i < m_lbNumbers.GetCount(); i++) { m_lbNumbers.GetText( i, str ); sz = pDC->GetTextExtent(str); if(sz.cx > dx) dx = sz.cx; } m_lbNumbers.ReleaseDC(pDC); m_lbNumbers.SetHorizontalExtent(dx);
(图 1. 使用该类)
(图 2. 演示输出)
类内部
/*static*/ LPNUMBERFMT CTextNumber::s_lpNumberFormat = NULL; #define INT8BUFSIZE 10 #define INT16BUFSIZE 20 #define INT32BUFSIZE 20 #define INT64BUFSIZE 40 void CTextNumber::operator=(signed __int8& i8Val) { TCHAR numBuffer[INT8BUFSIZE+1] = {0}; _itot_s(i8Val, numBuffer, INT8BUFSIZE, 10 ); GetNumberFormat(LOCALE_USER_DEFAULT, 0, numBuffer, s_lpNumberFormat, m_lpcBuffer, INT8BUFSIZE); } void CTextNumber::operator=(unsigned __int8& u8Val) { TCHAR numBuffer[INT8BUFSIZE+1] = {0}; _itot_s(u8Val, numBuffer, INT8BUFSIZE, 10 ); GetNumberFormat(LOCALE_USER_DEFAULT, 0, numBuffer, s_lpNumberFormat, m_lpcBuffer, INT8BUFSIZE); } void CTextNumber::operator=(__int16& i16Val) { TCHAR numBuffer[INT16BUFSIZE+1] = {0}; _itot_s(i16Val, numBuffer, INT16BUFSIZE, 10 ); GetNumberFormat(LOCALE_USER_DEFAULT, 0, numBuffer, s_lpNumberFormat, m_lpcBuffer, INT16BUFSIZE); } void CTextNumber::operator=(unsigned __int16& u16Val) { TCHAR numBuffer[INT16BUFSIZE+1] = {0}; _itot_s(u16Val, numBuffer, INT16BUFSIZE, 10 ); GetNumberFormat(LOCALE_USER_DEFAULT, 0, numBuffer, s_lpNumberFormat, m_lpcBuffer, INT16BUFSIZE); } void CTextNumber::operator=(__int32& i32Val) { TCHAR numBuffer[INT32BUFSIZE+1] = {0}; _itot_s(i32Val, numBuffer, INT32BUFSIZE, 10 ); GetNumberFormat(LOCALE_USER_DEFAULT, 0, numBuffer, s_lpNumberFormat, m_lpcBuffer, INT32BUFSIZE); } void CTextNumber::operator=(unsigned __int32& u32Val) { TCHAR numBuffer[INT32BUFSIZE+1] = {0}; _ultow_s(u32Val, numBuffer, 10 ); GetNumberFormat(LOCALE_USER_DEFAULT, 0, numBuffer, s_lpNumberFormat, m_lpcBuffer, INT32BUFSIZE); } void CTextNumber::operator=(__int64& i64Val) { TCHAR numBuffer[INT64BUFSIZE+1] = {0}; _i64tot_s(i64Val, numBuffer, INT64BUFSIZE, 10 ); GetNumberFormat(LOCALE_USER_DEFAULT, 0, numBuffer, s_lpNumberFormat, m_lpcBuffer, INT64BUFSIZE); } void CTextNumber::operator=(unsigned __int64& u64Val) { TCHAR numBuffer[INT64BUFSIZE+1] = {0}; _ui64tot_s(u64Val, numBuffer, INT64BUFSIZE, 10 ); GetNumberFormat(LOCALE_USER_DEFAULT, 0, numBuffer, s_lpNumberFormat, m_lpcBuffer, INT64BUFSIZE); } void CTextNumber::operator=(float& fVal) { TCHAR numBuffer[_CVTBUFSIZE+1] = {0}; TCHAR bufFormatter[20] = TEXT("%f"); if(s_lpNumberFormat) { _stprintf_s(bufFormatter, 20, TEXT("%%.%df"), s_lpNumberFormat->NumDigits); } _stprintf_s(numBuffer, _CVTBUFSIZE, bufFormatter, fVal); GetNumberFormat(LOCALE_USER_DEFAULT, 0, numBuffer, s_lpNumberFormat, m_lpcBuffer, _CVTBUFSIZE); } void CTextNumber::operator=(double& dbVal) { TCHAR numBuffer[(_CVTBUFSIZE*2)+1] = {0}; TCHAR bufFormatter[20] = TEXT("%f"); if(s_lpNumberFormat) { _stprintf_s(bufFormatter, 20, TEXT("%%.%df"), s_lpNumberFormat->NumDigits); } _stprintf_s(numBuffer, (_CVTBUFSIZE*2), bufFormatter, dbVal); GetNumberFormat(LOCALE_USER_DEFAULT, 0, numBuffer, s_lpNumberFormat, m_lpcBuffer, (_CVTBUFSIZE*2)); }
(图 3. 类代码)
替代方案
这是一个使用流来完成相同输出的代码块。Richard Taylor 让我了解了这一点,我不得不说,在允许依赖 STL 的情况下,我更喜欢它胜过我的类。
#include <locale> #include <string> #include <sstream> #include <iomanip> using namespace std; void CtesttextnumDlg::DoSTLMethod() { wostringstream oss; // Setup for locale... you only have to do this once. locale localeUS( "English_USA" ); oss.imbue( localeUS ); signed __int8 i8 = 0; oss << _T("INT8 value of 0 = ") << i8; m_lbNumbers.AddString(oss.str().c_str()); i8 = 1; oss.str( _T("") ); oss << _T("INT8 value of 1 = ") << i8; m_lbNumbers.AddString(oss.str().c_str()); i8 = -1; oss.str( _T("") ); oss << _T("INT8 value of -1 = ") << i8; m_lbNumbers.AddString(oss.str().c_str()); i8 = SCHAR_MAX; oss.str( _T("") ); oss << _T("INT8 value of SCHAR_MAX = ") << i8; m_lbNumbers.AddString(oss.str().c_str()); i8 = SCHAR_MIN; oss.str( _T("") ); oss << _T("INT8 value of SCHAR_MIN = ") << i8; m_lbNumbers.AddString(oss.str().c_str()); unsigned __int8 ui8 = 0; oss.str( _T("") ); oss << _T("UINT8 value of 0 = ") << ui8; m_lbNumbers.AddString(oss.str().c_str()); ui8 = 1; oss.str( _T("") ); oss << _T("UINT8 value of 1 = ") << ui8; m_lbNumbers.AddString(oss.str().c_str()); ui8 = -1; oss.str( _T("") ); oss << _T("UINT8 value of -1 = ") << ui8; m_lbNumbers.AddString(oss.str().c_str()); ui8 = UCHAR_MAX; oss.str( _T("") ); oss << _T("UINT8 value of UCHAR_MAX = ") << ui8; m_lbNumbers.AddString(oss.str().c_str()); // __int16 –32,768 to 32,767 // unsigned __int16 0 to 65,535 signed __int16 i16 = 0; oss.str( _T("") ); oss << _T("INT16 value of 0 = ") << i16; m_lbNumbers.AddString(oss.str().c_str()); i16 = 1; oss.str( _T("") ); oss << _T("INT16 value of 1 = ") << i16; m_lbNumbers.AddString(oss.str().c_str()); i16 = -1; oss.str( _T("") ); oss << _T("INT16 value of -1 = ") << i16; m_lbNumbers.AddString(oss.str().c_str()); i16 = SHRT_MAX; oss.str( _T("") ); oss << _T("INT16 value of SHRT_MAX = ") << i16; m_lbNumbers.AddString(oss.str().c_str()); i16 = SHRT_MIN; oss.str( _T("") ); oss << _T("INT16 value of SHRT_MIN = ") << i16; m_lbNumbers.AddString(oss.str().c_str()); unsigned __int16 ui16 = 0; oss.str( _T("") ); oss << _T("UINT16 value of 0 = ") << ui16; m_lbNumbers.AddString(oss.str().c_str()); ui16 = 1; oss.str( _T("") ); oss << _T("UINT16 value of 1 = ") << ui16; m_lbNumbers.AddString(oss.str().c_str()); ui16 = -1; oss.str( _T("") ); oss << _T("UINT16 value of -1 = ") << ui16; m_lbNumbers.AddString(oss.str().c_str()); ui16 = USHRT_MAX; oss.str( _T("") ); oss << _T("UINT16 value of USHRT_MAX = ") << ui16; m_lbNumbers.AddString(oss.str().c_str()); // __int32 –2,147,483,648 to 2,147,483,647 // unsigned __int32 0 to 4,294,967,295 signed __int32 i32 = 0; oss.str( _T("") ); oss << _T("INT32 value of 0 = ") << i32; m_lbNumbers.AddString(oss.str().c_str()); i32 = 1; oss.str( _T("") ); oss << _T("INT32 value of 1 = ") << i32; m_lbNumbers.AddString(oss.str().c_str()); i32 = -1; oss.str( _T("") ); oss << _T("INT32 value of -1 = ") << i32; m_lbNumbers.AddString(oss.str().c_str()); i32 = LONG_MAX; oss.str( _T("") ); oss << _T("INT32 value of LONG_MAX = ") << i32; m_lbNumbers.AddString(oss.str().c_str()); i32 = LONG_MIN; oss.str( _T("") ); oss << _T("INT32 value of LONG_MIN = ") << i32; m_lbNumbers.AddString(oss.str().c_str()); unsigned __int32 ui32 = 0; oss.str( _T("") ); oss << _T("UINT32 value of 0 = ") << ui32; m_lbNumbers.AddString(oss.str().c_str()); ui32 = 1; oss.str( _T("") ); oss << _T("UINT32 value of 1 = ") << ui32; m_lbNumbers.AddString(oss.str().c_str()); ui32 = -1; oss.str( _T("") ); oss << _T("UINT32 value of -1 = ") << ui32; m_lbNumbers.AddString(oss.str().c_str()); ui32 = ULONG_MAX; oss.str( _T("") ); oss << _T("UINT32 value of ULONG_MAX = ") << ui32; m_lbNumbers.AddString(oss.str().c_str()); // __int64 –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 // unsigned __int64 0 to 18446744073709551615 __int64 i64 = 0; oss.str( _T("") ); oss << _T("INT64 value of 0 = ") << i64; m_lbNumbers.AddString(oss.str().c_str()); i64 = 1; oss.str( _T("") ); oss << _T("INT64 value of 1 = ") << i64; m_lbNumbers.AddString(oss.str().c_str()); i64 = -1; oss.str( _T("") ); oss << _T("INT64 value of -1 = ") << i64; m_lbNumbers.AddString(oss.str().c_str()); i64 = _I64_MAX; oss.str( _T("") ); oss << _T("INT64 value of _I64_MAX = ") << i64; m_lbNumbers.AddString(oss.str().c_str()); i64 = _I64_MIN; oss.str( _T("") ); oss << _T("INT64 value of _I64_MIN = ") << i64; m_lbNumbers.AddString(oss.str().c_str()); unsigned __int64 u64 = 0; oss.str( _T("") ); oss << _T("UINT64 value of 0 = ") << u64; m_lbNumbers.AddString(oss.str().c_str()); u64 = 1; oss.str( _T("") ); oss << _T("UINT64 value of 1 = ") << u64; m_lbNumbers.AddString(oss.str().c_str()); u64 = -1; oss.str( _T("") ); oss << _T("UINT64 value of -1 = ") << u64; m_lbNumbers.AddString(oss.str().c_str()); u64 = _UI64_MAX; oss.str( _T("") ); oss << _T("UINT64 value of _UI64_MAX = ") << u64; m_lbNumbers.AddString(oss.str().c_str()); u64 = 9999999999999999999; oss.str( _T("") ); oss << _T("UINT64 value of 9999999999999999999 = ") << u64; m_lbNumbers.AddString(oss.str().c_str()); u64 = 0x8ac7230489e7ffff; oss.str( _T("") ); oss << _T("UINT64 value of 0x8ac7230489e7ffff = ") << u64; m_lbNumbers.AddString(oss.str().c_str()); float fVal = 0.0f; oss.str( _T("") ); oss << _T("float value of 0.0f = ") << std::setprecision(2) << fVal; m_lbNumbers.AddString(oss.str().c_str()); fVal = 1.1f; oss.str( _T("") ); oss << _T("float value of 1.1f = ") << fVal; fVal = 11.11f; oss.str( _T("") ); oss << _T("float value of 11.11f = ") << std::fixed << std::setprecision(2) << std::showpoint << fVal; m_lbNumbers.AddString(oss.str().c_str()); fVal = 111.111f; oss.str( _T("") ); oss << _T("float value of 111.111f = ") << std::fixed << std::setprecision(3) << std::showpoint << fVal; m_lbNumbers.AddString(oss.str().c_str()); fVal = 1111.1111f; oss.str( _T("") ); oss << _T("float value of 1111.1111f = ") << std::fixed << std::setprecision(4) << std::showpoint << fVal; m_lbNumbers.AddString(oss.str().c_str()); fVal = 11111.11111f; oss.str( _T("") ); oss << _T("float value of 11111.11111f = ") << std::fixed << std::setprecision(5) << std::showpoint << fVal; m_lbNumbers.AddString(oss.str().c_str()); fVal = 111111.111111f; oss.str( _T("") ); oss << _T("float value of 111111.111111f = ") << std::fixed << std::setprecision(6) << std::showpoint << fVal; m_lbNumbers.AddString(oss.str().c_str()); fVal = 3.4E+38f; oss.str( _T("") ); oss << _T("float value of 3.4E+38f = ") << std::fixed << std::setprecision(2) << std::showpoint << fVal; m_lbNumbers.AddString(oss.str().c_str()); double dbVal = 0.0; dbVal = 1.7E+308; oss.str( _T("") ); oss << _T("double value of 1.7E+308 = ") << std::fixed << std::setprecision(2) << std::showpoint << dbVal; m_lbNumbers.AddString(oss.str().c_str()); }
(图 3. STL 演示输出)
摘要
如果我遗漏了任何你认为应该在文章中提及的细节,请告诉我。
如果你能花一秒钟时间来评价这篇文章,甚至留下评论,将不胜感激。
感谢阅读!
历史
- 2006 年 8 月 9 日:修复了导致具有最大值的
double
错误转换的错误。 - 2006 年 7 月 27 日:现在使用
GetNumberFormat
;增加了对float
和double
的支持。 - 2006 年 7 月 27 日:在第一个帖子中,
__int32
转换存在一个错误,并且不支持__int16
...现在都已修复。