//******************************************************************************* // COPYRIGHT NOTES // --------------- // You may use this source code, compile or redistribute it as part of your application // for free. You cannot redistribute it as a part of a software development // library without the agreement of the author. If the sources are // distributed along with the application, you should leave the original // copyright notes in the source code without any changes. // This code can be used WITHOUT ANY WARRANTIES at your own risk. // // For the latest updates to this code, check this site: // http://www.masmex.com // after Sept 2000 // // Copyright(C) 2000 Philip Oldaker //******************************************************************************* // LocaleInfo.cpp: implementation of the CLocaleInfo class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "LocaleInfo.h" #include "TextParse.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// // static CLocaleInfo *CLocaleInfo::Instance() { static CLocaleInfo data; return &data; } CLocaleInfo::CLocaleInfo() { m_pszNegativeSign = NULL; m_pszDecimalSep = NULL; m_pszThousandSep = NULL; m_pszLongDate = NULL; m_pszShortDate = NULL; m_pszShortTime = NULL; m_pszLongTime = NULL; m_pszDateSep = NULL; m_pszTimeSep = NULL; GetAllLocaleInfo(); } CLocaleInfo::~CLocaleInfo() { delete []m_pszNegativeSign; delete []m_pszDecimalSep; delete []m_pszThousandSep; delete []m_pszLongDate; delete []m_pszShortDate; delete []m_pszShortTime; delete []m_pszLongTime; delete []m_pszDateSep; delete []m_pszTimeSep; } void CLocaleInfo::GetAllLocaleInfo() { m_pszShortTime = new TCHAR[MAX_PATH]; lstrcpy(m_pszShortTime,_T("H:mm")); AllocLocaleInfo(LOCALE_STIMEFORMAT,&m_pszLongTime); AllocLocaleInfo(LOCALE_SSHORTDATE,&m_pszShortDate); AllocLocaleInfo(LOCALE_SLONGDATE,&m_pszLongDate); AllocLocaleInfo(LOCALE_SDATE,&m_pszDateSep); AllocLocaleInfo(LOCALE_STIME,&m_pszTimeSep); AllocLocaleInfo(LOCALE_SNEGATIVESIGN,&m_pszNegativeSign); AllocLocaleInfo(LOCALE_SDECIMAL,&m_pszDecimalSep); AllocLocaleInfo(LOCALE_STHOUSAND,&m_pszThousandSep); } void CLocaleInfo::AllocLocaleInfo(LCTYPE lctype,LPTSTR *pszInfo) { int nLen = GetLocaleInfo(LOCALE_USER_DEFAULT,lctype,NULL,0); if (nLen) { *pszInfo = new TCHAR[nLen]; GetLocaleInfo(LOCALE_USER_DEFAULT,lctype,*pszInfo,nLen); } } CString CLocaleInfo::FormatDateTime(const COleDateTime &oleDateTime) { CString sDate, sTime; sDate = oleDateTime.Format(ConvertStdToWinFormat(GetShortDate())); sTime = oleDateTime.Format(ConvertStdToWinFormat(GetLongTime())); return sDate + _T(" ") + sTime; } CString CLocaleInfo::FormatDateTime(const FILETIME &ft) { COleDateTime oleDateTime(ft); return FormatDateTime(oleDateTime); } static struct FormatCodes { LPCTSTR szWinFormat; LPCTSTR szStdFormat; } FC[] = { { _T("M"), _T("%#m") }, { _T("MM"),_T("%m") }, { _T("MMM"),_T("%b") }, { _T("MMMM"),_T("%B") }, { _T("d"),_T("%#d") }, { _T("dd"),_T("%d") }, { _T("dddd"),_T("%A") }, { _T("yy"),_T("%y") }, { _T("yyyy"),_T("%Y") }, { _T("H"),_T("%#H") }, { _T("HH"),_T("%H") }, { _T("h"),_T("%#I") }, { _T("hh"),_T("%I") }, { _T("mm"),_T("%M") }, { _T("ss"),_T("%S") }, { _T("tt"),_T("%p") }, { NULL, NULL } }; // Short Format // M/d/yyyy // M/d/yy // MM/dd/yy // MM/dd/yyyy // yy/MM/dd // yyyy-MM-dd // dd-MMM-yy // Long Format // dddd, MMMM dd, yyyy // MMMM dd, yyyy // dddd, dd MMMM, yyyy // dd MMMM, yyyy // Time // H:mm:ss // h:mm:ss tt // hh:mm:ss tt // HH:mm:ss CString CLocaleInfo::ConvertStdToWinFormat(LPCTSTR pszFormat) { CString sCode; CString sWinFormat; CTextParse parse(pszFormat); CString sSeparators(_T(" -/,.:")); while (!parse.IsEnd()) { if (parse.CharAtCurrent(sSeparators)) { sCode = parse.CopyWhileChar(sSeparators); } else { sCode = parse.CopyUntilChar(sSeparators); } StdToWinFormatCode(sCode); sWinFormat += sCode; } return sWinFormat; } void CLocaleInfo::StdToWinFormatCode(CString &sCode) { for(int i=0;FC[i].szWinFormat != NULL;i++) { if (sCode == FC[i].szWinFormat) { sCode = FC[i].szStdFormat; break; } } }