|
@@ -0,0 +1,1200 @@
|
|
|
|
+#include "pch.h"
|
|
|
|
+#include "BaseUtility.h"
|
|
|
|
+#include <odbcinst.h>
|
|
|
|
+#include <comdef.h>
|
|
|
|
+#include <afxdb.h>
|
|
|
|
+#include <regex>
|
|
|
|
+
|
|
|
|
+typedef basic_string<char>::size_type S_T;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+bool IsLeap(int year)
|
|
|
|
+{
|
|
|
|
+ if((year%4==0&&year%100!=0)||year%400==0)
|
|
|
|
+ return true;
|
|
|
|
+ else
|
|
|
|
+ return false;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool IsWeekEnd(int year, int month, int day)
|
|
|
|
+{
|
|
|
|
+ struct tm stTime = {0};
|
|
|
|
+ struct tm *ptr = NULL;
|
|
|
|
+ time_t time;
|
|
|
|
+
|
|
|
|
+ stTime.tm_year = year - 1900;
|
|
|
|
+ stTime.tm_mon = month - 1;
|
|
|
|
+ stTime.tm_mday = day;
|
|
|
|
+ time = mktime(&stTime);
|
|
|
|
+
|
|
|
|
+ ptr = localtime(&time);
|
|
|
|
+ return (ptr->tm_wday == 0 || ptr->tm_wday == 6);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool Nextday(int& year, int& month, int& day)
|
|
|
|
+{
|
|
|
|
+ short ld[12]={31,28,31,30,31,30,31,31,30,31,30,31};
|
|
|
|
+
|
|
|
|
+ if (!(!(year%100)&&(year%400)) && !(year%4))
|
|
|
|
+ ld[1]++;
|
|
|
|
+ day++;
|
|
|
|
+ if (day<=0 || day>(unsigned long)ld[month-1])
|
|
|
|
+ {
|
|
|
|
+ day = 1; month++;
|
|
|
|
+ if(month>12)
|
|
|
|
+ {
|
|
|
|
+ month = 1; year++;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Full2Half(wchar_t* str)
|
|
|
|
+{
|
|
|
|
+ if(str != NULL)
|
|
|
|
+ {
|
|
|
|
+ int len = wcslen(str);
|
|
|
|
+
|
|
|
|
+ int i = 0;
|
|
|
|
+ wchar_t space[] = L" ";
|
|
|
|
+
|
|
|
|
+ for(; i<len; i++)
|
|
|
|
+ {
|
|
|
|
+ if(str[i] == space[0])//对空格特殊处理
|
|
|
|
+ {
|
|
|
|
+ str[i] = ' ';
|
|
|
|
+ }
|
|
|
|
+ else if(str[i] >= 65281 && str[i] <= 65374)
|
|
|
|
+ {
|
|
|
|
+ str[i] -= (65281 - 33);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool split(const tstring& src, tstring delimit,vector<tstring> &v, tstring null_subst)
|
|
|
|
+{
|
|
|
|
+ if(src.empty() || delimit.empty())
|
|
|
|
+ return false;
|
|
|
|
+ S_T deli_len = delimit.size();
|
|
|
|
+ long index = -1,last_search_position = 0;
|
|
|
|
+ while( (index=src.find(delimit,last_search_position))!=-1 )
|
|
|
|
+ {
|
|
|
|
+ if(index==last_search_position)
|
|
|
|
+ v.push_back(null_subst);
|
|
|
|
+ else
|
|
|
|
+ v.push_back( src.substr(last_search_position, index-last_search_position) );
|
|
|
|
+ last_search_position = index + deli_len;
|
|
|
|
+ }
|
|
|
|
+ tstring last_one = src.substr(last_search_position);
|
|
|
|
+ v.push_back( last_one.empty()? null_subst:last_one );
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool split(const string& src, string delimit, vector<string> &v, string null_subst)
|
|
|
|
+{
|
|
|
|
+ if (src.empty() || delimit.empty())
|
|
|
|
+ return false;
|
|
|
|
+ S_T deli_len = delimit.size();
|
|
|
|
+ long index = -1, last_search_position = 0;
|
|
|
|
+ while ((index = src.find(delimit, last_search_position)) != -1)
|
|
|
|
+ {
|
|
|
|
+ if (index == last_search_position)
|
|
|
|
+ v.push_back(null_subst);
|
|
|
|
+ else
|
|
|
|
+ v.push_back(src.substr(last_search_position, index - last_search_position));
|
|
|
|
+ last_search_position = index + deli_len;
|
|
|
|
+ }
|
|
|
|
+ string last_one = src.substr(last_search_position);
|
|
|
|
+ v.push_back(last_one.empty() ? null_subst : last_one);
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+vector<tstring> splitEx(const tstring& src, tstring separate_character)
|
|
|
|
+{
|
|
|
|
+ vector<tstring> strs;
|
|
|
|
+
|
|
|
|
+ int separate_characterLen = separate_character.size();//分割字符串的长度,这样就可以支持如“,,”多字符串的分隔符
|
|
|
|
+ int lastPosition = 0, index = -1;
|
|
|
|
+ while (-1 != (index = src.find(separate_character, lastPosition)))
|
|
|
|
+ {
|
|
|
|
+ strs.push_back(src.substr(lastPosition, index - lastPosition));
|
|
|
|
+ lastPosition = index + separate_characterLen;
|
|
|
|
+ }
|
|
|
|
+ tstring lastString = src.substr(lastPosition);//截取最后一个分隔符后的内容
|
|
|
|
+ if (!lastString.empty())
|
|
|
|
+ strs.push_back(lastString);//如果最后一个分隔符后还有内容就入队
|
|
|
|
+ return strs;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+vector<string> splitEx(const string& src, string separate_character)
|
|
|
|
+{
|
|
|
|
+ vector<string> strs;
|
|
|
|
+
|
|
|
|
+ int separate_characterLen = separate_character.size();//分割字符串的长度,这样就可以支持如“,,”多字符串的分隔符
|
|
|
|
+ int lastPosition = 0, index = -1;
|
|
|
|
+ while (-1 != (index = src.find(separate_character, lastPosition)))
|
|
|
|
+ {
|
|
|
|
+ strs.push_back(src.substr(lastPosition, index - lastPosition));
|
|
|
|
+ lastPosition = index + separate_characterLen;
|
|
|
|
+ }
|
|
|
|
+ string lastString = src.substr(lastPosition);//截取最后一个分隔符后的内容
|
|
|
|
+ if (!lastString.empty())
|
|
|
|
+ strs.push_back(lastString);//如果最后一个分隔符后还有内容就入队
|
|
|
|
+ return strs;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int GB2312_2_UTF8(char* buf, int buf_len, const char* src, int src_len)
|
|
|
|
+{
|
|
|
|
+ int i = 0, j = 0;
|
|
|
|
+
|
|
|
|
+ if (0 == src_len)
|
|
|
|
+ {
|
|
|
|
+ src_len = strlen(src);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < src_len;)
|
|
|
|
+ {
|
|
|
|
+ if (j >= buf_len - 1)
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ if (src[i] >= 0)
|
|
|
|
+ {
|
|
|
|
+ buf[j++] = src[i++];
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ unsigned short w_c = 0;
|
|
|
|
+ char tmp[4] = "";
|
|
|
|
+ Gb2312_2_Unicode(&w_c, src + i);
|
|
|
|
+
|
|
|
|
+ Unicode_2_UTF8(tmp, &w_c);
|
|
|
|
+
|
|
|
|
+ buf[j+0] = tmp[0];
|
|
|
|
+ buf[j+1] = tmp[1];
|
|
|
|
+ buf[j+2] = tmp[2];
|
|
|
|
+
|
|
|
|
+ i += 2;
|
|
|
|
+ j += 3;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ buf[j] = '\0';
|
|
|
|
+
|
|
|
|
+ return j;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Gb2312_2_Unicode(unsigned short* dst, const char* src)
|
|
|
|
+{
|
|
|
|
+ MultiByteToWideChar(936, MB_PRECOMPOSED, src, 2, (LPWSTR)dst, 1);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Unicode_2_UTF8(char* dst, unsigned short* src)
|
|
|
|
+{
|
|
|
|
+ char *pchar = (char *)src;
|
|
|
|
+
|
|
|
|
+ dst[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
|
|
|
|
+ dst[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
|
|
|
|
+ dst[2] = (0x80 | ( pchar[0] & 0x3F));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+string UTF8ToTstring(const char *pData, size_t size)
|
|
|
|
+{
|
|
|
|
+ size_t n = MultiByteToWideChar(CP_UTF8, 0, pData, (int)size, NULL, 0);
|
|
|
|
+ WCHAR *pChar = new WCHAR[n+1];
|
|
|
|
+
|
|
|
|
+ n = MultiByteToWideChar(CP_UTF8, 0, pData, (int)size, pChar, n);
|
|
|
|
+ pChar[n]=0;
|
|
|
|
+
|
|
|
|
+ n = WideCharToMultiByte(936, 0, pChar, -1, 0, 0, 0, 0);
|
|
|
|
+ char *p = new char[n+1];
|
|
|
|
+
|
|
|
|
+ n = WideCharToMultiByte(936, 0, pChar, -1, p, (int)n, 0, 0);
|
|
|
|
+ string result(p);
|
|
|
|
+
|
|
|
|
+ delete []pChar;
|
|
|
|
+ delete []p;
|
|
|
|
+ return result;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+string ConvertUTF8toGB2312(const char* pData, size_t size)
|
|
|
|
+{
|
|
|
|
+ size_t n = MultiByteToWideChar(CP_UTF8, 0, pData, (int)size, NULL, 0);
|
|
|
|
+ WCHAR* pChar = new WCHAR[n + 1];
|
|
|
|
+
|
|
|
|
+ n = MultiByteToWideChar(CP_UTF8, 0, pData, (int)size, pChar, n);
|
|
|
|
+ pChar[n] = 0;
|
|
|
|
+
|
|
|
|
+ n = WideCharToMultiByte(936, 0, pChar, -1, 0, 0, 0, 0);
|
|
|
|
+ char* p = new char[n + 1];
|
|
|
|
+
|
|
|
|
+ n = WideCharToMultiByte(936, 0, pChar, -1, p, (int)n, 0, 0);
|
|
|
|
+ string result(p);
|
|
|
|
+
|
|
|
|
+ delete[]pChar;
|
|
|
|
+ delete[]p;
|
|
|
|
+ return result;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+string ConvertGB2312toUTF8(const char *pData)
|
|
|
|
+{
|
|
|
|
+ int len = MultiByteToWideChar(936, 0, pData, -1, NULL, 0);
|
|
|
|
+ wchar_t* wstr = new wchar_t[len+1];
|
|
|
|
+ memset(wstr, 0, len+1);
|
|
|
|
+ MultiByteToWideChar(936, 0, pData, -1, wstr, len);
|
|
|
|
+ len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
|
|
|
|
+ char* str = new char[len+1];
|
|
|
|
+ memset(str, 0, len+1);
|
|
|
|
+ WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
|
|
|
|
+ if(wstr) delete[] wstr;
|
|
|
|
+ string strUtf8(str);
|
|
|
|
+ if(str) delete[] str;
|
|
|
|
+ return strUtf8;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+wstring GB2312ToUnicode(const char *pData)
|
|
|
|
+{
|
|
|
|
+ wstring str;
|
|
|
|
+ int len = MultiByteToWideChar(936, 0, pData, -1, NULL, 0); // 先取得转换后的UNICODE字符串所需的长度
|
|
|
|
+ if (len <= 0) return str;
|
|
|
|
+ wchar_t* pWstr = (wchar_t*)calloc(len + 1, sizeof(wchar_t)); // 分配缓冲区
|
|
|
|
+ MultiByteToWideChar(936, 0, pData, -1, pWstr, len); // 开始转换
|
|
|
|
+ str = pWstr;
|
|
|
|
+ if (pWstr) free(pWstr);
|
|
|
|
+ return str;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+string UnicodeToGB2312(TCHAR *pData)
|
|
|
|
+{
|
|
|
|
+ string str;
|
|
|
|
+ int len = WideCharToMultiByte(936, 0, pData, -1, NULL, 0, NULL, NULL); // 先取得转换后的ANSI字符串所需的长度
|
|
|
|
+ if (len <= 0) return str;
|
|
|
|
+ char* pStr = (char*)calloc(len + 1, sizeof(char)); // 分配缓冲区
|
|
|
|
+ WideCharToMultiByte(936, 0, pData, -1, pStr, len, NULL, NULL); // 开始转换
|
|
|
|
+ str = pStr;
|
|
|
|
+ if (pStr) free(pStr);
|
|
|
|
+ return str;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+void UTF8toANSI(string &strUTF8)
|
|
|
|
+{
|
|
|
|
+ //获取转换为多字节后需要的缓冲区大小,创建多字节缓冲区
|
|
|
|
+ UINT nLen = MultiByteToWideChar(CP_UTF8, NULL, strUTF8.c_str(), -1, NULL, NULL);
|
|
|
|
+ WCHAR *wszBuffer = new WCHAR[nLen + 1];
|
|
|
|
+ nLen = MultiByteToWideChar(CP_UTF8, NULL, strUTF8.c_str(), -1, wszBuffer, nLen);
|
|
|
|
+ wszBuffer[nLen] = 0;
|
|
|
|
+
|
|
|
|
+ nLen = WideCharToMultiByte(936, NULL, wszBuffer, -1, NULL, NULL, NULL, NULL);
|
|
|
|
+ char *szBuffer = new char[nLen + 1];
|
|
|
|
+ nLen = WideCharToMultiByte(936, NULL, wszBuffer, -1, szBuffer, nLen, NULL, NULL);
|
|
|
|
+ szBuffer[nLen] = 0;
|
|
|
|
+
|
|
|
|
+ strUTF8 = szBuffer;
|
|
|
|
+ //清理内存
|
|
|
|
+ delete[]szBuffer;
|
|
|
|
+ delete[]wszBuffer;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+string UnicodeToGB2312(const tstring& strSrc)
|
|
|
|
+{
|
|
|
|
+ return UnicodeToGB2312((LPTSTR)strSrc.c_str());
|
|
|
|
+}
|
|
|
|
+string UnicodeToGB2312(const CString& strSrc)
|
|
|
|
+{
|
|
|
|
+ tstring wstr = strSrc;
|
|
|
|
+ return UnicodeToGB2312((LPTSTR)wstr.c_str());
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+wstring UTF8ToUnicode(const char* szU8)
|
|
|
|
+{
|
|
|
|
+ wstring str;
|
|
|
|
+ if (szU8 == NULL)
|
|
|
|
+ {
|
|
|
|
+ return str;
|
|
|
|
+ }
|
|
|
|
+ //预转换,得到所需空间的大小;
|
|
|
|
+ int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
|
|
|
|
+ if (wcsLen <= 0) return str;
|
|
|
|
+ //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
|
|
|
|
+ wchar_t* pWStr = (wchar_t*)calloc(wcsLen + 1, sizeof(wchar_t));
|
|
|
|
+ //转换
|
|
|
|
+ ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), pWStr, wcsLen);
|
|
|
|
+ pWStr[wcsLen] = L'\0';
|
|
|
|
+ str = pWStr;
|
|
|
|
+ if (pWStr) free(pWStr);
|
|
|
|
+ return str;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+string UnicodeToUtf8(const wchar_t* unicode)
|
|
|
|
+{
|
|
|
|
+ string str;
|
|
|
|
+ int len;
|
|
|
|
+ len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);
|
|
|
|
+ if (len <= 0) return str;
|
|
|
|
+ char *szUtf8 = (char*)calloc(len + 1, sizeof(char));
|
|
|
|
+ WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, NULL, NULL);
|
|
|
|
+ szUtf8[len] = '\0';
|
|
|
|
+ str = szUtf8;
|
|
|
|
+ if (szUtf8) free(szUtf8);
|
|
|
|
+ return str;
|
|
|
|
+}
|
|
|
|
+tstring GB2312ToTstring(string str)
|
|
|
|
+{
|
|
|
|
+ tstring tstr=_T("");
|
|
|
|
+#ifdef _UNICODE
|
|
|
|
+ tstr=GB2312ToUnicode(str.c_str());
|
|
|
|
+#else
|
|
|
|
+ tstr=str;
|
|
|
|
+#endif
|
|
|
|
+ return tstr;
|
|
|
|
+}
|
|
|
|
+string TstringToGB2312(tstring tstr)
|
|
|
|
+{
|
|
|
|
+ string str = "";
|
|
|
|
+#ifdef _UNICODE
|
|
|
|
+ str = UnicodeToGB2312(tstr);
|
|
|
|
+#else
|
|
|
|
+ str = pData;
|
|
|
|
+#endif
|
|
|
|
+ return str;
|
|
|
|
+}
|
|
|
|
+string TstringToUTF8(tstring tstr)
|
|
|
|
+{
|
|
|
|
+ string str = "";
|
|
|
|
+#ifdef _UNICODE
|
|
|
|
+ str = UnicodeToUtf8(tstr.c_str());
|
|
|
|
+#else
|
|
|
|
+ char* p=ConvertGB2312toUTF8(tstr.c_str());
|
|
|
|
+ str=*p;
|
|
|
|
+ delete[]p;
|
|
|
|
+#endif
|
|
|
|
+ return str;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+tstring UTF8ToTstring(string str)
|
|
|
|
+{
|
|
|
|
+ tstring tstr = _T("");
|
|
|
|
+
|
|
|
|
+#ifdef _UNICODE
|
|
|
|
+ tstr = UTF8ToUnicode(str.c_str());
|
|
|
|
+#else
|
|
|
|
+ tstr = ConvertUTF8toGB2312(str.c_str(), str.length());
|
|
|
|
+#endif
|
|
|
|
+ return tstr;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool TransToPriceFormat(const tstring& strSrc, tstring& strDes, double& dDes)
|
|
|
|
+{
|
|
|
|
+ vector<tstring> vctPrice;
|
|
|
|
+ if (!split(strSrc, _T("|"), vctPrice))
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ strDes.clear();
|
|
|
|
+ for (int i = 0; i < vctPrice.size(); i++)
|
|
|
|
+ {
|
|
|
|
+ if (vctPrice[i].length() == 0)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ dDes += _tstof(vctPrice[i].c_str());
|
|
|
|
+
|
|
|
|
+ strDes.append(vctPrice[i]);
|
|
|
|
+
|
|
|
|
+ if (i != vctPrice.size()-1)
|
|
|
|
+ {
|
|
|
|
+ strDes.append(_T("+"));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int CalcWord(const char *ps, const size_t length)
|
|
|
|
+{
|
|
|
|
+ ASSERT(0 < length);
|
|
|
|
+ ASSERT(NULL != ps);
|
|
|
|
+ int nRealLen(0);
|
|
|
|
+ int nFlag(0);
|
|
|
|
+ while (nFlag <= length && 0 != ps[nRealLen])
|
|
|
|
+ {
|
|
|
|
+ if (IsChinese(ps[nRealLen]))
|
|
|
|
+ {
|
|
|
|
+ nRealLen++;
|
|
|
|
+ if (0 != ps[nRealLen])
|
|
|
|
+ nRealLen++;
|
|
|
|
+ else
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ nRealLen++;
|
|
|
|
+
|
|
|
|
+ nFlag++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return nRealLen;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Int64DateToStr(const __int64& llDate, string& out)
|
|
|
|
+{
|
|
|
|
+ int nYear = llDate / 10000000000L;
|
|
|
|
+ int nMode = llDate % 10000000000L;
|
|
|
|
+
|
|
|
|
+ int nMon = nMode / 100000000;
|
|
|
|
+ nMode %= 100000000;
|
|
|
|
+
|
|
|
|
+ int nDay = nMode / 1000000;
|
|
|
|
+ nMode %= 1000000;
|
|
|
|
+
|
|
|
|
+ int nHour = nMode / 10000;
|
|
|
|
+ nMode %= 10000;
|
|
|
|
+
|
|
|
|
+ int nMin = nMode / 100;
|
|
|
|
+ int nSec = nMode % 100;
|
|
|
|
+
|
|
|
|
+ char buf[20];
|
|
|
|
+ memset(buf, 0, 20);
|
|
|
|
+ sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", nYear,nMon,nDay,nHour,nMin,nSec);
|
|
|
|
+
|
|
|
|
+ out = buf;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Int64DateToYMDStr(const __int64& llDate, string& out)
|
|
|
|
+{
|
|
|
|
+ int nYear = llDate / 10000000000L;
|
|
|
|
+ int nMode = llDate % 10000000000L;
|
|
|
|
+
|
|
|
|
+ int nMon = nMode / 100000000;
|
|
|
|
+ nMode %= 100000000;
|
|
|
|
+
|
|
|
|
+ int nDay = nMode / 1000000;
|
|
|
|
+ nMode %= 1000000;
|
|
|
|
+
|
|
|
|
+ char buf[20];
|
|
|
|
+ memset(buf, 0, 20);
|
|
|
|
+ sprintf(buf, "%04d-%02d-%02d", nYear,nMon,nDay);
|
|
|
|
+
|
|
|
|
+ out = buf;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Int64DateToHMStr(const __int64& llDate, string& out)
|
|
|
|
+{
|
|
|
|
+ int nYear = llDate / 10000000000L;
|
|
|
|
+ int nMode = llDate % 10000000000L;
|
|
|
|
+
|
|
|
|
+ int nMon = nMode / 100000000;
|
|
|
|
+ nMode %= 100000000;
|
|
|
|
+
|
|
|
|
+ int nDay = nMode / 1000000;
|
|
|
|
+ nMode %= 1000000;
|
|
|
|
+
|
|
|
|
+ int nHour = nMode / 10000;
|
|
|
|
+ nMode %= 10000;
|
|
|
|
+
|
|
|
|
+ int nMin = nMode / 100;
|
|
|
|
+
|
|
|
|
+ char buf[20];
|
|
|
|
+ memset(buf, 0, 20);
|
|
|
|
+ sprintf(buf, "%02d:%02d", nHour,nMin);
|
|
|
|
+
|
|
|
|
+ out = buf;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+unsigned char ToHex(unsigned char x)
|
|
|
|
+{
|
|
|
|
+ return x > 9 ? x + 55 : x + 48;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+unsigned char FromHex(unsigned char x)
|
|
|
|
+{
|
|
|
|
+ unsigned char y;
|
|
|
|
+ if (x >= 'A' && x <= 'Z') y = x - 'A' + 10;
|
|
|
|
+ else if (x >= 'a' && x <= 'z') y = x - 'a' + 10;
|
|
|
|
+ else if (x >= '0' && x <= '9') y = x - '0';
|
|
|
|
+ return y;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+string UrlEncode(const string& str)
|
|
|
|
+{
|
|
|
|
+ string strTemp = "";
|
|
|
|
+ size_t length = str.length();
|
|
|
|
+ for (size_t i = 0; i < length; i++)
|
|
|
|
+ {
|
|
|
|
+ if (isalnum((unsigned char)str[i]) ||
|
|
|
|
+ (str[i] == '-') ||
|
|
|
|
+ (str[i] == '_') ||
|
|
|
|
+ (str[i] == '.') ||
|
|
|
|
+ (str[i] == '~'))
|
|
|
|
+ strTemp += str[i];
|
|
|
|
+ else if (str[i] == ' ')
|
|
|
|
+ strTemp += "+";
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ strTemp += '%';
|
|
|
|
+ strTemp += ToHex((unsigned char)str[i] >> 4);
|
|
|
|
+ strTemp += ToHex((unsigned char)str[i] % 16);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return strTemp;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+string UrlDecode(const string& str)
|
|
|
|
+{
|
|
|
|
+ string strTemp = "";
|
|
|
|
+ size_t length = str.length();
|
|
|
|
+ for (size_t i = 0; i < length; i++)
|
|
|
|
+ {
|
|
|
|
+ if (str[i] == '+') strTemp += ' ';
|
|
|
|
+ else if (str[i] == '%')
|
|
|
|
+ {
|
|
|
|
+ unsigned char high = FromHex((unsigned char)str[++i]);
|
|
|
|
+ unsigned char low = FromHex((unsigned char)str[++i]);
|
|
|
|
+ strTemp += high*16 + low;
|
|
|
|
+ }
|
|
|
|
+ else strTemp += str[i];
|
|
|
|
+ }
|
|
|
|
+ return strTemp;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void DeleteDirectory(const CString &strPath)
|
|
|
|
+{
|
|
|
|
+ if (strPath.IsEmpty())
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ CFileFind ff;
|
|
|
|
+ BOOL bFound = ff.FindFile(strPath + _T("\\*"), 0);
|
|
|
|
+ while(bFound)
|
|
|
|
+ {
|
|
|
|
+ bFound = ff.FindNextFile();
|
|
|
|
+ if ((ff.GetFileName() == _T(".")) || (ff.GetFileName() == _T("..")))
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ SetFileAttributes(ff.GetFilePath(), FILE_ATTRIBUTE_NORMAL);
|
|
|
|
+ if (ff.IsDirectory())
|
|
|
|
+ {
|
|
|
|
+ DeleteDirectory(ff.GetFilePath());
|
|
|
|
+ RemoveDirectory(ff.GetFilePath());
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ DeleteFile(ff.GetFilePath());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ff.Close();
|
|
|
|
+ //RemoveDirectory(strPath);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void toUpper(char *szDestination, const char *szSource)
|
|
|
|
+{
|
|
|
|
+ if (szDestination == NULL || szSource == NULL || strlen(szSource) == 0)
|
|
|
|
+ return;
|
|
|
|
+ while (*szSource != 0)
|
|
|
|
+ {
|
|
|
|
+ if (*szSource >= 'a' && *szSource <= 'z')
|
|
|
|
+ *szDestination++ = 'A' + (*szSource++ - 'a');
|
|
|
|
+ else
|
|
|
|
+ *szDestination++ = *szSource++;
|
|
|
|
+ }
|
|
|
|
+ *szDestination = 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void toUpper(TCHAR *szDestination, const TCHAR *szSource)
|
|
|
|
+{
|
|
|
|
+ if (szDestination == NULL || szSource == NULL || _tcslen(szSource) == 0)
|
|
|
|
+ return;
|
|
|
|
+ while (*szSource != 0)
|
|
|
|
+ {
|
|
|
|
+ if (*szSource >= 'a' && *szSource <= 'z')
|
|
|
|
+ *szDestination++ = 'A' + (*szSource++ - 'a');
|
|
|
|
+ else
|
|
|
|
+ *szDestination++ = *szSource++;
|
|
|
|
+ }
|
|
|
|
+ *szDestination = 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void FormatPrice(char *szDes, const double dSource)
|
|
|
|
+{
|
|
|
|
+ sprintf(szDes, "%.9lf", dSource);
|
|
|
|
+ int i(0);
|
|
|
|
+ int nLen(strlen(szDes));
|
|
|
|
+ for (; i < nLen; i++)
|
|
|
|
+ {
|
|
|
|
+ if (szDes[i] == '.')
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ for (int j = nLen - 1; j > i + 2; j--)
|
|
|
|
+ {
|
|
|
|
+ if (szDes[j] == '0')
|
|
|
|
+ szDes[j] = 0;
|
|
|
|
+ else
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool CombinationVolRemark(string &strDes, const char *szVol, const char *szRemark)
|
|
|
|
+{
|
|
|
|
+ vector<string> vctVol;
|
|
|
|
+ vector<string> vctRemark;
|
|
|
|
+ bool bRet(true);
|
|
|
|
+ if (!split(szVol, "|", vctVol))
|
|
|
|
+ bRet = false;
|
|
|
|
+ if (!split(szRemark, "|", vctRemark))
|
|
|
|
+ bRet = false;
|
|
|
|
+ if (vctVol.size() != vctRemark.size())
|
|
|
|
+ bRet = false;
|
|
|
|
+
|
|
|
|
+ if (!bRet)
|
|
|
|
+ {
|
|
|
|
+ if (!split(szVol, "+", vctVol))
|
|
|
|
+ bRet = false;
|
|
|
|
+ else
|
|
|
|
+ bRet = true;
|
|
|
|
+ if (!split(szRemark, "+", vctRemark))
|
|
|
|
+ bRet = false;
|
|
|
|
+ else
|
|
|
|
+ bRet = true;
|
|
|
|
+
|
|
|
|
+ if (vctVol.size() != vctRemark.size())
|
|
|
|
+ bRet = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!bRet)
|
|
|
|
+ return bRet;
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < vctVol.size(); i++)
|
|
|
|
+ {
|
|
|
|
+ if (i != 0)
|
|
|
|
+ strDes.append("+");
|
|
|
|
+ if (vctVol[i].empty())
|
|
|
|
+ strDes.append("--");
|
|
|
|
+ else
|
|
|
|
+ strDes.append(vctVol[i]);
|
|
|
|
+
|
|
|
|
+ if (!vctRemark[i].empty())
|
|
|
|
+ {
|
|
|
|
+ strDes.append("(");
|
|
|
|
+ strDes.append(vctRemark[i]);
|
|
|
|
+ strDes.append(")");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+string replace(const char *szContext, char oldChar, const char *szNew)
|
|
|
|
+{
|
|
|
|
+ int nLen = strlen(szContext) + 1;
|
|
|
|
+ if (szNew != NULL)
|
|
|
|
+ nLen += strlen(szNew);
|
|
|
|
+ char *pTemp = new char[nLen];
|
|
|
|
+ autoptr_arr<char> arrguard(pTemp);
|
|
|
|
+ memset(pTemp, 0, nLen);
|
|
|
|
+ char *pResult = pTemp;
|
|
|
|
+ while(*szContext != 0)
|
|
|
|
+ {
|
|
|
|
+ if (*szContext == oldChar)
|
|
|
|
+ {
|
|
|
|
+ if (szNew != NULL)
|
|
|
|
+ {
|
|
|
|
+ while (*szNew!= 0)
|
|
|
|
+ {
|
|
|
|
+ *pTemp++ = *szNew++;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ *pTemp++ = *szContext;
|
|
|
|
+ }
|
|
|
|
+ szContext++;
|
|
|
|
+ }
|
|
|
|
+ return string(pResult);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool CombinationQuoteData(string &strDes, const char *szVol, const char *szRemark/* = NULL*/
|
|
|
|
+ , const char *szDanger/* = NULL*/, const char *szOCO/* = NULL*/, const char *szPACK/* = NULL*/)
|
|
|
|
+{
|
|
|
|
+ if (szVol == NULL)
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ vector<const char*> vctData;
|
|
|
|
+ vctData.push_back(szVol);
|
|
|
|
+
|
|
|
|
+ if (szDanger != NULL)
|
|
|
|
+ {
|
|
|
|
+ vctData.push_back(szDanger);
|
|
|
|
+ }
|
|
|
|
+ if (szOCO != NULL)
|
|
|
|
+ {
|
|
|
|
+ vctData.push_back(szOCO);
|
|
|
|
+ }
|
|
|
|
+ if (szPACK != NULL)
|
|
|
|
+ {
|
|
|
|
+ vctData.push_back(szPACK);
|
|
|
|
+ }
|
|
|
|
+ if (szRemark != NULL && strlen(szRemark) > 0 && strcmp(szRemark, "--") != 0)
|
|
|
|
+ {
|
|
|
|
+ vctData.push_back(szRemark);
|
|
|
|
+ }
|
|
|
|
+ const char* arrSeparators[2] = {"|", "+"};
|
|
|
|
+ bool bMulti(false);
|
|
|
|
+ int nIdx(0);
|
|
|
|
+ for (int i = 0; i < 2; i++)
|
|
|
|
+ {
|
|
|
|
+ if (strstr(szVol, arrSeparators[i]) != NULL)
|
|
|
|
+ {
|
|
|
|
+ nIdx = i;
|
|
|
|
+ bMulti = true;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (bMulti)
|
|
|
|
+ {
|
|
|
|
+ vector<vector<string>> vctSplit;
|
|
|
|
+ for (int i = 0; i < vctData.size(); i++)
|
|
|
|
+ {
|
|
|
|
+ vector<string> vct;
|
|
|
|
+ if (!split(vctData[i], arrSeparators[nIdx], vct))
|
|
|
|
+ {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ vctSplit.push_back(vct);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ int nCount(vctSplit[0].size());
|
|
|
|
+
|
|
|
|
+ for (int i = 1; i < vctSplit.size(); i++)
|
|
|
|
+ {
|
|
|
|
+ if (nCount != vctSplit[i].size())
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < nCount; i++)
|
|
|
|
+ {
|
|
|
|
+ if (i != 0)
|
|
|
|
+ strDes.append("+");
|
|
|
|
+
|
|
|
|
+ if (strlen((vctSplit[0])[i].c_str()) == 0)
|
|
|
|
+ strDes.append("--");
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ strDes.append((vctSplit[0])[i]);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ string strTemp;
|
|
|
|
+
|
|
|
|
+ for (int j = 1; j < vctSplit.size(); j++)
|
|
|
|
+ {
|
|
|
|
+ if (strlen((vctSplit[j])[i].c_str()) != 0)
|
|
|
|
+ {
|
|
|
|
+ strTemp.append((vctSplit[j])[i]);
|
|
|
|
+ strTemp.append(",");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (!strTemp.empty())
|
|
|
|
+ {
|
|
|
|
+ if (strTemp[strTemp.size() - 1] == ',')
|
|
|
|
+ {
|
|
|
|
+ strTemp = string(strTemp.c_str(), strTemp.size() - 1);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!strTemp.empty())
|
|
|
|
+ {
|
|
|
|
+ strDes.append("(");
|
|
|
|
+ strDes.append(strTemp);
|
|
|
|
+ strDes.append(")");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ if (strlen(szVol) == 0)
|
|
|
|
+ {
|
|
|
|
+ strDes.append("--");
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ strDes.append(szVol);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ string strTemp;
|
|
|
|
+
|
|
|
|
+ for (int i = 1; i < vctData.size(); i++)
|
|
|
|
+ {
|
|
|
|
+ if (strlen(vctData[i]) != 0)
|
|
|
|
+ {
|
|
|
|
+ strTemp.append(vctData[i]);
|
|
|
|
+ strTemp.append(",");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (!strTemp.empty())
|
|
|
|
+ {
|
|
|
|
+ if (strTemp[strTemp.size() - 1] == ',')
|
|
|
|
+ {
|
|
|
|
+ strTemp = string(strTemp.c_str(), strTemp.size() - 1);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (!strTemp.empty())
|
|
|
|
+ {
|
|
|
|
+ strDes.append("(");
|
|
|
|
+ strDes.append(strTemp);
|
|
|
|
+ strDes.append(")");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+__int64 StringToInt64(const TCHAR *szSource)
|
|
|
|
+{
|
|
|
|
+ __int64 ret(0);
|
|
|
|
+ if (_tcslen(szSource) == 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ const TCHAR *pTemp = szSource + _tcslen(szSource) - 1;
|
|
|
|
+ __int64 nRight(1);
|
|
|
|
+ bool bNegative(false);
|
|
|
|
+ if ('-' == szSource[0])
|
|
|
|
+ bNegative = true;
|
|
|
|
+ do
|
|
|
|
+ {
|
|
|
|
+ if (*pTemp >= '0' && *pTemp <= '9')
|
|
|
|
+ {
|
|
|
|
+ ret += nRight * (0 + (*pTemp - '0'));
|
|
|
|
+ nRight *= 10;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ while(pTemp-- != szSource);
|
|
|
|
+ if (bNegative)
|
|
|
|
+ ret = -ret;
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void SafeCopyData(TCHAR dest[], int destSize, TCHAR* src)
|
|
|
|
+{
|
|
|
|
+ int srcSize = _tcslen(src);
|
|
|
|
+ if (srcSize == 0)
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if (srcSize > destSize)
|
|
|
|
+ memcpy(dest, src, destSize);
|
|
|
|
+ else
|
|
|
|
+ _tcscpy(dest, src);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void SafeCopyData(TCHAR dest[], int destSize, tstring str)
|
|
|
|
+{
|
|
|
|
+ int srcSize = str.length();
|
|
|
|
+ if (srcSize == 0)
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if (srcSize > destSize)
|
|
|
|
+ memcpy(dest, str.c_str(), destSize);
|
|
|
|
+ else
|
|
|
|
+ _tcscpy(dest, str.c_str());
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+tstring GetRequestByKey(const tstring& tstrKey, const tstring& tstrReuest)
|
|
|
|
+{
|
|
|
|
+ string strKey = UnicodeToGB2312(tstrKey);
|
|
|
|
+ string strReuest = UnicodeToGB2312(tstrReuest);
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ smatch result;
|
|
|
|
+ if (regex_search(strReuest.cbegin(), strReuest.cend(), result, regex(strKey + "=(.*?)&")))
|
|
|
|
+ {
|
|
|
|
+ return GB2312ToUnicode(result[1].str().c_str());
|
|
|
|
+ }
|
|
|
|
+ else if (regex_search(strReuest.cbegin(), strReuest.cend(), result, regex(strKey + "=(.*)")))
|
|
|
|
+ {
|
|
|
|
+ return GB2312ToUnicode(result[1].str().c_str());
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ return tstring();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ catch (...)
|
|
|
|
+ {
|
|
|
|
+ return tstring();
|
|
|
|
+ }
|
|
|
|
+ return tstring();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void GetKeysByUrl(const tstring & strUrl, vector<tstring> & vctKey)
|
|
|
|
+{
|
|
|
|
+ vector<tstring> vctSearch;
|
|
|
|
+ split(strUrl, _T("?"), vctSearch);
|
|
|
|
+ if (vctSearch.size() != 2 && vctSearch.size() != 1)
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ tstring strTemp;
|
|
|
|
+ if (vctSearch.size() == 1)
|
|
|
|
+ {
|
|
|
|
+ strTemp = vctSearch[0];
|
|
|
|
+ }
|
|
|
|
+ else if (vctSearch.size() == 2)
|
|
|
|
+ {
|
|
|
|
+ strTemp = vctSearch[1];
|
|
|
|
+ }
|
|
|
|
+ vctSearch.clear();
|
|
|
|
+ split(strTemp, _T("&"), vctSearch);
|
|
|
|
+ if (vctSearch.size() <= 0)
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ for (int i = 0; i < vctSearch.size(); i++)
|
|
|
|
+ {
|
|
|
|
+ strTemp = vctSearch[i];
|
|
|
|
+ vector<tstring> vct;
|
|
|
|
+ split(strTemp, _T("="), vct);
|
|
|
|
+ if (vct.size() == 2)
|
|
|
|
+ {
|
|
|
|
+ vctKey.push_back(vct[0]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+__int64 GetCharNumber(TCHAR* szText, size_t n)
|
|
|
|
+{
|
|
|
|
+ __int64 nDest;
|
|
|
|
+ if (n == 0)
|
|
|
|
+ {
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ for (nDest = 0; n--; szText++)
|
|
|
|
+ {
|
|
|
|
+ if (*szText < '0' || *szText > '9')
|
|
|
|
+ {
|
|
|
|
+ continue; //继续获取下一个字符
|
|
|
|
+ }
|
|
|
|
+ /*
|
|
|
|
+ 1、当前字符值 *line的ascii码,减去字符0的ascii码,得出个位数字
|
|
|
|
+ 2、原计算的value值 乘以10,向上提升一位
|
|
|
|
+ 3、二者相加得到新的十进制数值
|
|
|
|
+ */
|
|
|
|
+ nDest = nDest * 10 + (*szText - '0');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (nDest < 0)
|
|
|
|
+ {
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ return nDest;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+tstring ANSIToUnicode(const string& str)
|
|
|
|
+{
|
|
|
|
+ int len = 0;
|
|
|
|
+ len = str.length();
|
|
|
|
+ int unicodeLen = ::MultiByteToWideChar(936,
|
|
|
|
+ 0,
|
|
|
|
+ str.c_str(),
|
|
|
|
+ -1,
|
|
|
|
+ NULL,
|
|
|
|
+ 0);
|
|
|
|
+ wchar_t * pUnicode;
|
|
|
|
+ pUnicode = new wchar_t[unicodeLen + 1];
|
|
|
|
+ memset(pUnicode, 0, (unicodeLen + 1)*sizeof(wchar_t));
|
|
|
|
+ ::MultiByteToWideChar(936,
|
|
|
|
+ 0,
|
|
|
|
+ str.c_str(),
|
|
|
|
+ -1,
|
|
|
|
+ (LPWSTR)pUnicode,
|
|
|
|
+ unicodeLen);
|
|
|
|
+ tstring rt;
|
|
|
|
+ rt = (wchar_t*)pUnicode;
|
|
|
|
+ delete pUnicode;
|
|
|
|
+
|
|
|
|
+ return rt;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+CString AddNumberSeparate(CString strSrc)
|
|
|
|
+{
|
|
|
|
+ auto IsNumberFunc = [=](CString str)
|
|
|
|
+ {
|
|
|
|
+ int nCount = 0;
|
|
|
|
+ for (int i = 0; i < str.GetLength(); i++)
|
|
|
|
+ {
|
|
|
|
+ if (i == 0)
|
|
|
|
+ {
|
|
|
|
+ if (str.GetAt(i) == '-')
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (!((str.GetAt(i) >= '0' && str.GetAt(i) <= '9') || str.GetAt(i) == '.'))
|
|
|
|
+ {
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
+ if (str.GetAt(i) == '.')
|
|
|
|
+ {
|
|
|
|
+ nCount++;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (nCount > 1)
|
|
|
|
+ {
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
+ return TRUE;
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ CString str(strSrc);
|
|
|
|
+ if (IsNumberFunc(str))
|
|
|
|
+ {
|
|
|
|
+ int nPos = 0;
|
|
|
|
+ nPos = str.Find(_T("."), nPos);
|
|
|
|
+ vector<int> vcteparatePos;
|
|
|
|
+ if (nPos == -1)
|
|
|
|
+ {
|
|
|
|
+ for (int i = str.GetLength() - 3; i > 0; i--)
|
|
|
|
+ {
|
|
|
|
+ if ((str.GetLength() - i) % 3 == 0)
|
|
|
|
+ {
|
|
|
|
+ if (!(i == 1 && str.GetAt(0) == '-'))
|
|
|
|
+ {
|
|
|
|
+ vcteparatePos.push_back(i);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ for (int i = nPos - 3; i > 0; i--)
|
|
|
|
+ {
|
|
|
|
+ if ((nPos - i) % 3 == 0)
|
|
|
|
+ {
|
|
|
|
+ if (!(i == 1 && str.GetAt(0) == '-'))
|
|
|
|
+ {
|
|
|
|
+ vcteparatePos.push_back(i);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for (int i = 0; i < vcteparatePos.size(); i++)
|
|
|
|
+ {
|
|
|
|
+ str.Insert(vcteparatePos[i], ',');
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return str;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool RegexStdMatch(string src, string regular)
|
|
|
|
+{
|
|
|
|
+ regex pattern(regular.c_str());
|
|
|
|
+ if (!regex_match(src, pattern))
|
|
|
|
+ {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool RegexStdMatch(tstring src, tstring regular)
|
|
|
|
+{
|
|
|
|
+ char* pre = setlocale(LC_ALL, "");
|
|
|
|
+ setlocale(LC_ALL, "chs");
|
|
|
|
+ std::wregex pattern(regular.c_str());
|
|
|
|
+ if (!regex_match(src, pattern))
|
|
|
|
+ {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+CString FormatNumberString(CString strData)
|
|
|
|
+{
|
|
|
|
+ TCHAR szTemp[32] = { 0 };
|
|
|
|
+ _stprintf(szTemp, _T("%0.4lf"), _tstof(strData));
|
|
|
|
+ CString str = szTemp;
|
|
|
|
+ str.TrimRight(_T("0"));
|
|
|
|
+ if (str.Find(_T(".")) == (str.GetLength() - 1))
|
|
|
|
+ str.TrimRight(_T("."));
|
|
|
|
+ return str;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+tstring replace_all(tstring& str, const tstring& old_value, const tstring& new_value)
|
|
|
|
+{
|
|
|
|
+ while (true)
|
|
|
|
+ {
|
|
|
|
+ tstring::size_type pos(0);
|
|
|
|
+ if ((pos = str.find(old_value)) != tstring::npos)
|
|
|
|
+ str.replace(pos, old_value.length(), new_value);
|
|
|
|
+ else break;
|
|
|
|
+ }
|
|
|
|
+ return str;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+tstring FormatInt32Value(int nValue)
|
|
|
|
+{
|
|
|
|
+ TCHAR szTemp[64] = { 0 };
|
|
|
|
+ _stprintf(szTemp, _T("%d"), nValue);
|
|
|
|
+ return tstring(szTemp);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+string FormatInt32Value2(int nValue)
|
|
|
|
+{
|
|
|
|
+ char szTemp[64] = { 0 };
|
|
|
|
+ sprintf(szTemp, "%d", nValue);
|
|
|
|
+ return string(szTemp);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+tstring FormatInt64Value(__int64 nValue)
|
|
|
|
+{
|
|
|
|
+ TCHAR szTemp[64] = { 0 };
|
|
|
|
+ _stprintf(szTemp, _T("%lld"), nValue);
|
|
|
|
+ return tstring(szTemp);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+tstring FormatFloatValue(double fValue)
|
|
|
|
+{
|
|
|
|
+ TCHAR szTemp[32] = { 0 };
|
|
|
|
+ _stprintf(szTemp, _T("%0.3lf"), fValue);
|
|
|
|
+ CString str = szTemp;
|
|
|
|
+ str.TrimRight(_T("0"));
|
|
|
|
+ if (str.Find(_T(".")) == (str.GetLength() - 1))
|
|
|
|
+ str.TrimRight(_T("."));
|
|
|
|
+ return tstring(str);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+string FormatFloatValue2(double fValue)
|
|
|
|
+{
|
|
|
|
+ char szTemp[64] = { 0 };
|
|
|
|
+ sprintf(szTemp, "%0.3lf", fValue);
|
|
|
|
+ return string(szTemp);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+CString GetAppPath()
|
|
|
|
+{
|
|
|
|
+ CString strRetun = _T("");
|
|
|
|
+
|
|
|
|
+#ifdef _UNICODE
|
|
|
|
+ TCHAR szBuff[MAX_PATH];
|
|
|
|
+ HMODULE module = GetModuleHandle(0);
|
|
|
|
+ GetModuleFileName(module, szBuff, sizeof(szBuff));
|
|
|
|
+ strRetun.Format(_T("%s"), szBuff);
|
|
|
|
+
|
|
|
|
+#else
|
|
|
|
+ HMODULE module = GetModuleHandle(0);
|
|
|
|
+ CHAR szBuff[MAX_PATH];
|
|
|
|
+ GetModuleFileName(module, szBuff, sizeof(szBuff));
|
|
|
|
+ strRetun.Format(_T("%s"), szBuff);
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ int pos = strRetun.ReverseFind(_T('\\'));
|
|
|
|
+
|
|
|
|
+ if (pos != -1)
|
|
|
|
+ {
|
|
|
|
+ strRetun = strRetun.Left(pos);
|
|
|
|
+ }
|
|
|
|
+ return strRetun;
|
|
|
|
+}
|