stringutils.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 2,672 行 · 第 1/5 页

CPP
2,672
字号
		#endif	#endif	return result;}VCF::ulong64 StringUtils::fromStringAsULong64( const VCF::String& value ){	ulong64 result = 0;	#ifdef VCF_OSX		CFTextString tmp;		tmp = value;		result = CFStringGetIntValue( tmp );		if ( 0 == (int)result ) {			//check_true_error( tmp );		} else if ( (INT_MIN == (int)result) || (INT_MAX == (int)result) ) {			throw BasicException( L"StringUtils::fromStringAsULong64() Overflow - Unable to convert: " + value );		}	#else		#ifdef VCF_MSC			#if ( _MSC_VER >= 1300 )				result = _wcstoui64( value.c_str(), NULL, 10 );			#else				/* we risk overflow, but that's the best we can do 				if reported problems we need to use swscanf */				result = _wtoi64( value.c_str() );			#endif			if ( (ulong64)0 == result && ( value[0] != '0' ) &&					( -1 != swscanf( value.c_str(), L"%I64u", &result ) ) ) {				throw BasicException( L"StringUtils::fromStringAsULong64() Unable to convert: " + value );			}		#else			int ret = swscanf( value.c_str(), L"%I64u", &result );			if ( ret != 1 ) {				throw BasicException( L"StringUtils::fromStringAsULong64() Unable to convert: " + value );			}		#endif	#endif	return result;}float StringUtils::fromStringAsFloat( const VCF::String& value ){	float result = 0;	#ifdef VCF_OSX		CFTextString tmp;		tmp = value;		result = (float)CFStringGetDoubleValue( tmp );		if ( 0.0 == result ) {			//check_true_error( tmp );		}	#else		#if ( defined VCF_MSC ) && ( _MSC_VER >= 1300 )			result = _wtof( value.c_str() );			if ( 0 == result && ( value[0] != '0' && value[0] != '.' ) &&					( -1 != swscanf( value.c_str(), W_STR_FLOAT_CONVERSION, &result ) ) ) {				throw BasicException( L"StringUtils::fromStringAsFloat() Unable to convert: " + value );			}		#else			int ret = swscanf( value.c_str(), W_STR_FLOAT_CONVERSION, &result );			if ( ret != 1 ) {				throw BasicException( L"StringUtils::fromStringAsFloat() Unable to convert: " + value );			}		#endif	#endif	return result;}double StringUtils::fromStringAsDouble( const VCF::String& value ){	double result = 0;	#ifdef VCF_OSX		CFTextString tmp;		tmp = value;		result = CFStringGetDoubleValue( tmp );		if ( 0.0 == result ) {			//check_true_error( tmp );		}	#else		#if ( defined VCF_MSC ) && ( _MSC_VER >= 1300 )			result = _wtof( value.c_str() );			if ( 0 == result && ( value[0] != '0' && value[0] != '.' ) &&					( -1 != swscanf( value.c_str(), W_STR_DOUBLE_CONVERSION, &result ) ) ) {				throw BasicException( L"StringUtils::fromStringAsDouble() Unable to convert: " + value );			}		#else			int ret = swscanf( value.c_str(), W_STR_DOUBLE_CONVERSION, &result );			if ( ret != 1 ) {				throw BasicException( L"StringUtils::fromStringAsDouble() Unable to convert: " + value );			}		#endif	#endif	return result;}char StringUtils::fromStringAsChar( const VCF::String& value ){	char result = 0;	#ifdef VCF_OSX		sscanf( value.ansi_c_str(), STR_CHAR_CONVERSION, &result );	#else		int ret = swscanf( value.c_str(), W_STR_CHAR_CONVERSION, &result );		if ( ret != 1 ) {			throw BasicException( L"StringUtils::fromStringAsChar() Unable to convert: " + value );		}	#endif	return result;}short StringUtils::fromStringAsShort( const VCF::String& value ){	int result = 0;	#ifdef VCF_OSX		CFTextString tmp;		tmp = value;		result = CFStringGetIntValue( tmp );	#else		#ifdef VCF_MSC			result = _wtoi( value.c_str() );			if ( 0 == result && ( value[0] != '0' && value[0] != '.' ) &&					( -1 != swscanf( value.c_str(), W_STR_SHORT_CONVERSION, &result ) ) ) {				throw BasicException( L"StringUtils::fromStringAsShort() Unable to convert: " + value );			}		#else			int ret = swscanf( value.c_str(), W_STR_SHORT_CONVERSION, &result );			if ( ret != 1 ) {				throw BasicException( L"StringUtils::fromStringAsShort() Unable to convert: " + value );			}		#endif	#endif	return (short)result;}bool StringUtils::fromStringAsBool( const VCF::String& value ){	bool result = false;	if ( value == W_STR_BOOL_CONVERSION_TRUE ){		result = true;	}	else if ( value == W_STR_BOOL_CONVERSION_FALSE ){		result = false;	}	return result;}VCF::String StringUtils::format( const DateTime& date, const String& formatting ){	String result;	const VCFChar* p = formatting.c_str();	const VCFChar* start = p;	const VCFChar* current = p;	int size = formatting.size();	int pos = 0;	unsigned long  y = date.getYear();	unsigned long m = date.getMonth();	unsigned long d = date.getDay();	VCFChar tmp[256];	int tmpLen = sizeof(tmp)/sizeof(VCFChar);	memset( tmp, 0, sizeof(tmp) );	bool hashCharFound = false;	int formatArgCount = 1;	while ( (p-start) < size ) {		if ( ('%' == *p) || (hashCharFound) ) {			p++;			switch ( *p ) {				case '#' : {					hashCharFound = true;					formatArgCount = 2;					p --;				}				break;				//	%% - Percent sign				case '%' : {					result.append( current, (p-current) -formatArgCount );					result += "%";					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;				//	%a - Abbreviated weekday name				case 'a' : {					result.append( current, (p-current) -formatArgCount );					result += StringUtils::abbrevWeekdays[date.getWeekDay()];					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;				//	%A - Full weekday name				case 'A' : {					result.append( current, (p-current) -formatArgCount );					result += StringUtils::weekdays[date.getWeekDay()];					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;				//	%b - Abbreviated month name				case 'b' : {					result.append( current, (p-current) -formatArgCount );					result += StringUtils::abbrevMonths[m-1];					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;				//	%B - Full month name				case 'B' : {					result.append( current, (p-current) -formatArgCount );					result += StringUtils::months[m-1];					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;				//	%c - Date and time representation appropriate for locale				case 'c' : {					result.append( current, (p-current) -formatArgCount );					result += L"{insert Locale date/time here}";					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;				//	%d - Day of month as decimal number (01  31)				case 'd' : {					result.append( current, (p-current) -formatArgCount );					if ( hashCharFound ) {						#ifdef VCF_OSX							CFTextString cfStr;							cfStr.format( CFSTR("%d"), d );							cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );							tmp[ minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;						#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)							swprintf( tmp, sizeof(tmp)-1, L"%d", d );						#else							swprintf( tmp, L"%d", d );						#endif					}					else {						#ifdef VCF_OSX							CFTextString cfStr;							cfStr.format( CFSTR("%02d"), d );							cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );							tmp[ minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;						#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)							swprintf( tmp, tmpLen-1, L"%02d", d );						#else							swprintf( tmp, L"%02d", d );						#endif					}					result += tmp;					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;				//	%D or %j - Day of year as decimal number (001  366)				case 'D' : case 'j' : {					result.append( current, (p-current) -formatArgCount );					if ( hashCharFound ) {						#ifdef VCF_OSX							CFTextString cfStr;							cfStr.format( CFSTR("%d"), date.getDayOfYear() );							cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );							tmp[ minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;						#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)							swprintf( tmp, tmpLen-1, L"%d", date.getDayOfYear() );						#else							swprintf( tmp, L"%d", date.getDayOfYear() );						#endif							result += tmp;					}					else {						#ifdef VCF_OSX							CFTextString cfStr;							cfStr.format( CFSTR("%03d"), date.getDayOfYear() );							cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );							tmp[minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;						#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)							swprintf( tmp, tmpLen-1, L"%03d", date.getDayOfYear()  );						#else							swprintf( tmp, L"%03d", date.getDayOfYear()  );						#endif						result += tmp;					}					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;				//	%H - Hour in 24-hour format (00  23)				case 'H' : {					result.append( current, (p-current) -formatArgCount );					if ( hashCharFound ) {						#ifdef VCF_OSX							CFTextString cfStr;							cfStr.format( CFSTR("%d"), date.getHour() );							cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );							tmp[minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;						#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)							swprintf( tmp, tmpLen-1, L"%d", date.getHour() );						#else							swprintf( tmp, L"%d", date.getHour() );						#endif					}					else {						#ifdef VCF_OSX							CFTextString cfStr;							cfStr.format( CFSTR("%02d"), date.getHour() );							cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );							tmp[minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;						#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)							swprintf( tmp, tmpLen-1, L"%02d", date.getHour() );						#else							swprintf( tmp, L"%02d", date.getHour() );						#endif					}					result += tmp;					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;				//	%I - Hour in 12-hour format (01  12)				case 'I' : {					result.append( current, (p-current) -formatArgCount );					int h = date.getHour() % 12;					if ( h == 0 ) {						h = 12;					}					if ( hashCharFound ) {						#ifdef VCF_OSX							CFTextString cfStr;							cfStr.format( CFSTR("%d"), h );							cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );							tmp[ minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;						#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)							swprintf( tmp, tmpLen-1, L"%d", h );						#else							swprintf( tmp, L"%d", h );						#endif					}					else {						#ifdef VCF_OSX							CFTextString cfStr;							cfStr.format( CFSTR("%02d"), h );							cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );							tmp[minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;						#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)							swprintf( tmp, tmpLen-1, L"%02d", h );						#else							swprintf( tmp, L"%02d", h );						#endif					}						result += tmp;						current = p + 1;						hashCharFound = false;						formatArgCount = 1;					}				break;				//	%m - Month as decimal number (01  12)				case 'm' : {					result.append( current, (p-current) -formatArgCount );					if ( hashCharFound ) {						#ifdef VCF_OSX							CFTextString cfStr;							cfStr.format( CFSTR("%d"), m );							cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );							tmp[minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;						#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)							swprintf( tmp, tmpLen-1, L"%d", m  );						#else							swprintf( tmp, L"%d", m  );						#endif					}					else {						#ifdef VCF_OSX							CFTextString cfStr;							cfStr.format( CFSTR("%02d"), m );							cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );							tmp[minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;						#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)							swprintf( tmp, tmpLen-1, L"%02d", m  );						#else							swprintf( tmp, L"%02d", m  );						#endif					}					result += tmp;					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;				//	%M - Minute as decimal number (00  59)				case 'M' : {					result.append( current, (p-current) -formatArgCount );					if ( hashCharFound ) {						#ifdef VCF_OSX							CFTextString cfStr;							cfStr.format( CFSTR("%d"), date.getMinute() );							cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );							tmp[minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;						#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)							swprintf( tmp, tmpLen-1, L"%d", date.getMinute()  );						#else							swprintf( tmp, L"%d", date.getMinute()  );						#endif						}						else {						#ifdef VCF_OSX							CFTextString cfStr;							cfStr.format( CFSTR("%02d"), date.getMinute() );							cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );							tmp[minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;						#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)							swprintf( tmp, tmpLen-1, L"%02d", date.getMinute()  );						#else							swprintf( tmp, L"%02d", date.getMinute()  );						#endif					}					result += tmp;					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;				//	%P - Current locale's A.M./P.M. indicator for 12-hour clock				case 'P' : {					result.append( current, (p-current) -formatArgCount );					result += L"{Locale's AM/PM indicator}";					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;				// %s - millisecond part				case 's' : {					result.append( current, (p-current) -formatArgCount );					#ifdef VCF_OSX						CFTextString cfStr;						cfStr.format( CFSTR("%03d"), date.getMillisecond() );						cfStr.copy( tmp, minVal<uint32>(cfStr.length(),tmpLen-1) );						tmp[minVal<uint32>(cfStr.length(),tmpLen-1) ] = 0;					#elif defined(VCF_POSIX) || defined(VCF_CW_W32) || defined(VCF_DMC)						swprintf( tmp, tmpLen-1, L"%03d", date.getMillisecond()  );					#else						swprintf( tmp, L"%03d", date.getMillisecond()  );					#endif					result += tmp;					current = p + 1;					hashCharFound = false;					formatArgCount = 1;				}				break;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?