1 //*******************************************************************************
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.
11 // For the latest updates to this code, check this site:
12 // http://www.masmex.com
15 // Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
16 //*******************************************************************************
18 // LocaleInfo.cpp: implementation of the CLocaleInfo class.
20 //////////////////////////////////////////////////////////////////////
23 #include "LocaleInfo.h"
24 #include "TextParse.h"
26 //////////////////////////////////////////////////////////////////////
27 // Construction/Destruction
28 //////////////////////////////////////////////////////////////////////
30 CLocaleInfo *CLocaleInfo::Instance()
32 static CLocaleInfo data;
36 CLocaleInfo::CLocaleInfo()
38 m_pszNegativeSign = NULL;
39 m_pszDecimalSep = NULL;
40 m_pszThousandSep = NULL;
42 m_pszShortDate = NULL;
43 m_pszShortTime = NULL;
50 CLocaleInfo::~CLocaleInfo()
52 delete []m_pszNegativeSign;
53 delete []m_pszDecimalSep;
54 delete []m_pszThousandSep;
55 delete []m_pszLongDate;
56 delete []m_pszShortDate;
57 delete []m_pszShortTime;
58 delete []m_pszLongTime;
59 delete []m_pszDateSep;
60 delete []m_pszTimeSep;
63 void CLocaleInfo::GetAllLocaleInfo()
65 m_pszShortTime = new TCHAR[MAX_PATH];
66 lstrcpy(m_pszShortTime,_T("H:mm"));
67 AllocLocaleInfo(LOCALE_STIMEFORMAT,&m_pszLongTime);
68 AllocLocaleInfo(LOCALE_SSHORTDATE,&m_pszShortDate);
69 AllocLocaleInfo(LOCALE_SLONGDATE,&m_pszLongDate);
70 AllocLocaleInfo(LOCALE_SDATE,&m_pszDateSep);
71 AllocLocaleInfo(LOCALE_STIME,&m_pszTimeSep);
72 AllocLocaleInfo(LOCALE_SNEGATIVESIGN,&m_pszNegativeSign);
73 AllocLocaleInfo(LOCALE_SDECIMAL,&m_pszDecimalSep);
74 AllocLocaleInfo(LOCALE_STHOUSAND,&m_pszThousandSep);
77 void CLocaleInfo::AllocLocaleInfo(LCTYPE lctype,LPTSTR *pszInfo)
79 int nLen = GetLocaleInfo(LOCALE_USER_DEFAULT,lctype,NULL,0);
82 *pszInfo = new TCHAR[nLen];
83 GetLocaleInfo(LOCALE_USER_DEFAULT,lctype,*pszInfo,nLen);
87 CString CLocaleInfo::FormatDateTime(const COleDateTime &oleDateTime)
90 sDate = oleDateTime.Format(ConvertStdToWinFormat(GetShortDate()));
91 sTime = oleDateTime.Format(ConvertStdToWinFormat(GetLongTime()));
92 return sDate + _T(" ") + sTime;
95 CString CLocaleInfo::FormatDateTime(const FILETIME &ft)
97 COleDateTime oleDateTime(ft);
98 return FormatDateTime(oleDateTime);
101 static struct FormatCodes
106 { _T("M"), _T("%#m") },
107 { _T("MM"),_T("%m") },
108 { _T("MMM"),_T("%b") },
109 { _T("MMMM"),_T("%B") },
110 { _T("d"),_T("%#d") },
111 { _T("dd"),_T("%d") },
112 { _T("dddd"),_T("%A") },
113 { _T("yy"),_T("%y") },
114 { _T("yyyy"),_T("%Y") },
115 { _T("H"),_T("%#H") },
116 { _T("HH"),_T("%H") },
117 { _T("h"),_T("%#I") },
118 { _T("hh"),_T("%I") },
119 { _T("mm"),_T("%M") },
120 { _T("ss"),_T("%S") },
121 { _T("tt"),_T("%p") },
135 // dddd, MMMM dd, yyyy
137 // dddd, dd MMMM, yyyy
146 CString CLocaleInfo::ConvertStdToWinFormat(LPCTSTR pszFormat)
150 CTextParse parse(pszFormat);
151 CString sSeparators(_T(" -/,.:"));
152 while (!parse.IsEnd())
154 if (parse.CharAtCurrent(sSeparators))
156 sCode = parse.CopyWhileChar(sSeparators);
160 sCode = parse.CopyUntilChar(sSeparators);
162 StdToWinFormatCode(sCode);
168 void CLocaleInfo::StdToWinFormatCode(CString &sCode)
170 for(int i=0;FC[i].szWinFormat != NULL;i++)
172 if (sCode == FC[i].szWinFormat)
174 sCode = FC[i].szStdFormat;