LocaleInfo.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:4k
源码类别:

图形图象

开发平台:

Visual C++

  1. //*******************************************************************************
  2. // COPYRIGHT NOTES
  3. // ---------------
  4. // You may use this source code, compile or redistribute it as part of your application 
  5. // for free. You cannot redistribute it as a part of a software development 
  6. // library without the agreement of the author. If the sources are 
  7. // distributed along with the application, you should leave the original 
  8. // copyright notes in the source code without any changes.
  9. // This code can be used WITHOUT ANY WARRANTIES at your own risk.
  10. // 
  11. // For the latest updates to this code, check this site:
  12. // http://www.masmex.com 
  13. // after Sept 2000
  14. // 
  15. // Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
  16. //*******************************************************************************
  17. // LocaleInfo.cpp: implementation of the CLocaleInfo class.
  18. //
  19. //////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "LocaleInfo.h"
  22. #include "TextParse.h"
  23. //////////////////////////////////////////////////////////////////////
  24. // Construction/Destruction
  25. //////////////////////////////////////////////////////////////////////
  26. // static
  27. CLocaleInfo *CLocaleInfo::Instance()
  28. {
  29. static CLocaleInfo data;
  30. return &data;
  31. }
  32. CLocaleInfo::CLocaleInfo()
  33. {
  34. m_pszNegativeSign = NULL;
  35. m_pszDecimalSep = NULL;
  36. m_pszThousandSep = NULL;
  37. m_pszLongDate = NULL;
  38. m_pszShortDate = NULL;
  39. m_pszShortTime = NULL;
  40. m_pszLongTime = NULL;
  41. m_pszDateSep = NULL;
  42. m_pszTimeSep = NULL;
  43. GetAllLocaleInfo();
  44. }
  45. CLocaleInfo::~CLocaleInfo()
  46. {
  47. delete []m_pszNegativeSign;
  48. delete []m_pszDecimalSep;
  49. delete []m_pszThousandSep;
  50. delete []m_pszLongDate;
  51. delete []m_pszShortDate;
  52. delete []m_pszShortTime;
  53. delete []m_pszLongTime;
  54. delete []m_pszDateSep;
  55. delete []m_pszTimeSep;
  56. }
  57. void CLocaleInfo::GetAllLocaleInfo()
  58. {
  59. m_pszShortTime = new TCHAR[MAX_PATH];
  60. lstrcpy(m_pszShortTime,_T("H:mm"));
  61. AllocLocaleInfo(LOCALE_STIMEFORMAT,&m_pszLongTime);
  62. AllocLocaleInfo(LOCALE_SSHORTDATE,&m_pszShortDate);
  63. AllocLocaleInfo(LOCALE_SLONGDATE,&m_pszLongDate);
  64. AllocLocaleInfo(LOCALE_SDATE,&m_pszDateSep);
  65. AllocLocaleInfo(LOCALE_STIME,&m_pszTimeSep);
  66. AllocLocaleInfo(LOCALE_SNEGATIVESIGN,&m_pszNegativeSign);
  67. AllocLocaleInfo(LOCALE_SDECIMAL,&m_pszDecimalSep);
  68. AllocLocaleInfo(LOCALE_STHOUSAND,&m_pszThousandSep);
  69. }
  70. void CLocaleInfo::AllocLocaleInfo(LCTYPE lctype,LPTSTR *pszInfo)
  71. {
  72. int nLen = GetLocaleInfo(LOCALE_USER_DEFAULT,lctype,NULL,0);
  73. if (nLen)
  74. {
  75. *pszInfo = new TCHAR[nLen];
  76. GetLocaleInfo(LOCALE_USER_DEFAULT,lctype,*pszInfo,nLen);
  77. }
  78. }
  79. CString CLocaleInfo::FormatDateTime(const COleDateTime &oleDateTime)
  80. {
  81. CString sDate, sTime;
  82. sDate = oleDateTime.Format(ConvertStdToWinFormat(GetShortDate()));
  83. sTime = oleDateTime.Format(ConvertStdToWinFormat(GetLongTime()));
  84. return sDate + _T(" ") + sTime;
  85. }
  86. CString CLocaleInfo::FormatDateTime(const FILETIME &ft)
  87. {
  88. COleDateTime oleDateTime(ft);
  89. return FormatDateTime(oleDateTime);
  90. }
  91. static struct FormatCodes
  92. {
  93. LPCTSTR szWinFormat;
  94. LPCTSTR szStdFormat;
  95. } FC[] = { 
  96. { _T("M"), _T("%#m") },
  97. { _T("MM"),_T("%m") },
  98. { _T("MMM"),_T("%b") },
  99. { _T("MMMM"),_T("%B") },
  100. { _T("d"),_T("%#d") },
  101. { _T("dd"),_T("%d") },
  102. { _T("dddd"),_T("%A") },
  103. { _T("yy"),_T("%y") },
  104. { _T("yyyy"),_T("%Y") },
  105. { _T("H"),_T("%#H") },
  106. { _T("HH"),_T("%H") },
  107. { _T("h"),_T("%#I") },
  108. { _T("hh"),_T("%I") },
  109. { _T("mm"),_T("%M") },
  110. { _T("ss"),_T("%S") },
  111. { _T("tt"),_T("%p") },
  112. {  NULL, NULL }
  113. };
  114. // Short Format
  115. // M/d/yyyy
  116. // M/d/yy
  117. // MM/dd/yy
  118. // MM/dd/yyyy
  119. // yy/MM/dd
  120. // yyyy-MM-dd
  121. // dd-MMM-yy
  122. // Long Format
  123. // dddd, MMMM dd, yyyy
  124. // MMMM dd, yyyy
  125. // dddd, dd MMMM, yyyy
  126. // dd MMMM, yyyy
  127. // Time
  128. // H:mm:ss
  129. // h:mm:ss tt
  130. // hh:mm:ss tt
  131. // HH:mm:ss
  132. CString CLocaleInfo::ConvertStdToWinFormat(LPCTSTR pszFormat)
  133. {
  134. CString sCode;
  135. CString sWinFormat;
  136. CTextParse parse(pszFormat);
  137. CString sSeparators(_T(" -/,.:"));
  138. while (!parse.IsEnd())
  139. {
  140. if (parse.CharAtCurrent(sSeparators))
  141. {
  142. sCode = parse.CopyWhileChar(sSeparators);
  143. }
  144. else
  145. {
  146. sCode = parse.CopyUntilChar(sSeparators);
  147. }
  148. StdToWinFormatCode(sCode);
  149. sWinFormat += sCode;
  150. }
  151. return sWinFormat;
  152. }
  153. void CLocaleInfo::StdToWinFormatCode(CString &sCode)
  154. {
  155. for(int i=0;FC[i].szWinFormat != NULL;i++) 
  156. {
  157. if (sCode == FC[i].szWinFormat)
  158. {
  159. sCode = FC[i].szStdFormat;
  160. break;
  161. }
  162. }
  163. }