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 + -
显示快捷键?