工作中重新封装编写的一系列工具函数(c/c++)

本文档展示了C++中用于节点操作、JSON处理、字符串分割、文件操作等的实用工具函数JGUtil的实现,包括添加节点、设置所有子节点透明度、字符串分割、文件复制、文件是否存在判断、保存和读取JSON、绘制圆角矩形等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//

//  JGUtil.cpp


//


#include "JGUtil.h"

#include "cocos2d.h"

#include "ui/CocosGUI.h"

USING_NS_CC;


//targetNode添加到curNode

void JGUtil::replaceNodeParent(Node* curNode, Node* targetNode)

{

    //记录坐标

    Vec2 pos = targetNode->getPosition();

    Vec2 anchor = targetNode->getAnchorPoint();

    int zOrder = targetNode->getLocalZOrder();

    Node* parent = targetNode->getParent();

    

    //这个一定要,不然出现各种奇爬问题

    Size itemSize = targetNode->getContentSize();

    targetNode->setPosition(Vec2(itemSize.width*anchor.x,itemSize.height*anchor.y));

    targetNode->retain();

    targetNode->removeFromParent();


    //ui加入到当前

    curNode->addChild(targetNode);

    curNode->setContentSize(itemSize);

    targetNode->release();

    //设置当前坐标

    curNode->setPosition(pos);

    curNode->setAnchorPoint(anchor);

    curNode->setLocalZOrder(zOrder);

    if(parent != nullptr)

    parent->addChild(curNode);

}


void JGUtil::setAllCascadeOpacityEnabled(cocos2d::Node *node)

{

    node->setCascadeOpacityEnabled(true);

    if(node->getChildrenCount()>0)

    {

        for(int i = 0 ; i< node->getChildren().size(); i++)

        {

            Node* child = node->getChildren().at(i);

            setAllCascadeOpacityEnabled(child);

        }

    }

}



std::vector<std::string> JGUtil::split(std::string str,std::string pattern) {

    std::string::size_type pos;

    std::vector<std::string> result;

    result.clear();

    str += pattern;//扩展字符串以方便操作

    size_t size = str.size();

    

    for(int i = 0; i< size; i++)

    {

        pos = str.find(pattern,i);

        if(pos < size)

        {

            std::string s = str.substr(i,pos - i);

            result.push_back(s);

            i = (int)(pos + pattern.size()) - 1;

        }

    }

    return result;

}


void JGUtil::copyData(const char* pFileName) {

    if (isFileExist(pFileName)) {

        return;

    }

    std::string strPath = FileUtils::getInstance()->fullPathForFilename(pFileName);

    log("strPath = %s",strPath.c_str());

    ssize_t len = 0;

    unsigned char *data = NULL;

    data = FileUtils::getInstance()->getFileData(strPath.c_str(), "r",&len);

    log("len = %d",(int)len);

    std::string destPath = FileUtils::getInstance()->getWritablePath();

    destPath += pFileName;

    FILE *fp = fopen(destPath.c_str(), "w+");

    fwrite(data, sizeof(char), len, fp);

    fclose(fp);

    delete[] data;

    data = NULL;

}


bool JGUtil::isFileExist(const char* pFileName) {

    if (!pFileName)

        return false;

    std::string filePath = FileUtils::getInstance()->getWritablePath();

    filePath += pFileName;

    FILE *fp = fopen(filePath.c_str(), "r");

    if (fp) {

        fclose(fp);

        return true;

    }

    return false;

}


void JGUtil::saveToFile(const std::string &str, const std::string filename)

{

    std::string filePath = FileUtils::getInstance()->fullPathForFilename(filename);

    FILE *pFile = fopen(filePath.c_str(),"wb+");

    if(!pFile)

    {

        log("save to file error::%s", filename.c_str());

        return;

    }

    fputs(str.c_str(),pFile);

    fclose(pFile);

     log("save to file success::%s", filename.c_str());

}


void JGUtil::readJson(JsonBox::Value &json,const std::string filename) {

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    JGUtil::copyData(filename.c_str());

    std::string s_filepath = CCFileUtils::sharedFileUtils()->getWritablePath() + filename;

    json.loadFromFile(s_filepath.c_str());

#else

    std::string s_filepath = FileUtils::getInstance()->fullPathForFilename(filename);

    log("claudis filename = %s",s_filepath.c_str());

    json.loadFromFile(s_filepath.c_str());

    //log("claudis %s",json.getString().c_str());

#endif

}


bool JGUtil::readJson(rapidjson::Document &doc,const std::string filename) {

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    JGUtil::copyData(filename.c_str());

    std::string s_filepath = CCFileUtils::sharedFileUtils()->getWritablePath() + filename;

    

    ssize_t size;

    unsigned char *ch = FileUtils::getInstance()->getFileData(s_filepath,"rw",&size);

    std::string data = std::string((const char*)ch,size);

    doc.Parse<0>(data.c_str());///<通过Parse方法将Json数据解析出来

    if(doc.HasParseError())

    {

        CCLOG("GetParseError%s\n",doc.GetParseError());

        return false;

    }

    return true;

//    json.readJson(json, s_filepath.c_str());

#else

    ssize_t size;

    std::string s_filepath = FileUtils::getInstance()->fullPathForFilename(filename);

    unsigned char *ch = FileUtils::getInstance()->getFileData(s_filepath,"rw",&size);

    std::string data = std::string((const char*)ch,size);

    doc.Parse<0>(data.c_str());///<通过Parse方法将Json数据解析出来

    if(doc.HasParseError())

    {

        CCLOG("GetParseError%s\n",doc.GetParseError());

        return false;

    }

    return true;

#endif

}



ClippingNode* JGUtil::ccDrawRoundRect(cocos2d::Sprite *bgSprite, cocos2d::Vec2 origin, cocos2d::Vec2 destination, float radius, unsigned int segments){

    

    Sprite *thisbgSprite = bgSprite;

    ClippingNode* pClip = ClippingNode::create();

    

    pClip->setInverted(false);//设置是否反向,将决定画出来的圆是透明的还是黑色的

    //    this->addChild(pClip);

    pClip->setAnchorPoint(Point(0, 0));

    pClip->setPosition(-7, -7);

    

    //算出1/4

    

    const float coef = 0.5f * (float)M_PI / segments;

    Point * vertices = new Point[segments + 1];

    Point * thisVertices = vertices;

    for (unsigned int i = 0; i <= segments; ++i, ++thisVertices)

    {

        float rads = (segments - i)*coef;

        thisVertices->x = (int)(radius * sinf(rads));

        thisVertices->y = (int)(radius * cosf(rads));

    }

    //

    Point tagCenter;

    float minX = MIN(origin.x, destination.x);

    float maxX = MAX(origin.x, destination.x);

    float minY = MIN(origin.y, destination.y);

    float maxY = MAX(origin.y, destination.y);

    

    unsigned int dwPolygonPtMax = (segments + 1) * 4;

    Point * pPolygonPtArr = new Point[dwPolygonPtMax];

    Point * thisPolygonPt = pPolygonPtArr;

    int aa = 0;

    //左上角

    tagCenter.x = minX + radius;

    tagCenter.y = maxY - radius;

    thisVertices = vertices;

    for (unsigned int i = 0; i <= segments; ++i, ++thisPolygonPt, ++thisVertices)

    {

        thisPolygonPt->x = tagCenter.x - thisVertices->x;

        thisPolygonPt->y = tagCenter.y + thisVertices->y;

        ++aa;

    }

    //右上角

    tagCenter.x = maxX - radius;

    tagCenter.y = maxY - radius;

    thisVertices = vertices + segments;

    for (unsigned int i = 0; i <= segments; ++i, ++thisPolygonPt, --thisVertices)

    {

        thisPolygonPt->x = tagCenter.x + thisVertices->x;

        thisPolygonPt->y = tagCenter.y + thisVertices->y;

        ++aa;

    }

    //右下角

    tagCenter.x = maxX - radius;

    tagCenter.y = minY + radius;

    thisVertices = vertices;

    for (unsigned int i = 0; i <= segments; ++i, ++thisPolygonPt, ++thisVertices)

    {

        thisPolygonPt->x = tagCenter.x + thisVertices->x;

        thisPolygonPt->y = tagCenter.y - thisVertices->y;

        ++aa;

    }

    //左下角

    tagCenter.x = minX + radius;

    tagCenter.y = minY + radius;

    thisVertices = vertices + segments;

    for (unsigned int i = 0; i <= segments; ++i, ++thisPolygonPt, --thisVertices)

    {

        thisPolygonPt->x = tagCenter.x - thisVertices->x;

        thisPolygonPt->y = tagCenter.y - thisVertices->y;

        // log("%f , %f", thisPolygonPt->x, thisPolygonPt->y);

        ++aa;

    }

    

    //设置参数

    static Color4F red(1, 0, 0, 1);//顶点颜色设置为红色,参数是R,G,B,透明度

    

    //注意不要将pStencil addChild

    DrawNode *pStencil = DrawNode::create();

    pStencil->drawPolygon(pPolygonPtArr, dwPolygonPtMax, red, 0, red);//绘制这个多边形

    

    pStencil->setPosition(Point(0, 0));

    

    pClip->setStencil(pStencil);

    

    

    pClip->addChild(thisbgSprite, 1);

    pClip->setContentSize(thisbgSprite->getContentSize());

    

    CC_SAFE_DELETE_ARRAY(vertices);

    CC_SAFE_DELETE_ARRAY(pPolygonPtArr);

    return pClip;

}


void JGUtil::saveDataToJson(JsonBox::Value &json,const std::string filename) {

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    

    std::string s_filepath = CCFileUtils::sharedFileUtils()->getWritablePath() + filename;

    json.writeToFile(s_filepath);

#else

    std::string s_filepath = FileUtils::getInstance()->fullPathForFilename(filename);

    json.writeToFile(s_filepath);

 

#endif

}


void JGUtil::saveDataToJson(rapidjson::Document &json,const std::string filename) {

    rapidjson::StringBuffer buffer;

    rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);

    json.Accept(writer);

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    //system("delE:\cocos2d-x-3.2rc0\tests\cpp-empty-test\Resources\test.josn");///<先将文件删除掉---之前重这个文件读取数据,因此确保这个文件存在了

    std::string s_filepath = CCFileUtils::sharedFileUtils()->getWritablePath() + filename;

    FILE *file = fopen(s_filepath.c_str(),"wb");

    if(file)

    {

        fputs(buffer.GetString(),file);

        fclose(file);

    }

#else //if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

    std::string s_filepath = FileUtils::getInstance()->fullPathForFilename(filename);

    //log("claudis ############## %s",s_filepath.c_str());

    FILE *file= fopen(s_filepath.c_str(),"wb");

    if(file)

    {

        fputs(buffer.GetString(),file);

        fclose(file);

    }

#endif

}



wchar_t* JGUtil::MBCS2Unicode(wchar_t * buff, const char * str)

{

    wchar_t *wp = buff;

    char * p = (char *)str;

    while(*p)

    {

        if(*p & 0x80)

        {

            *wp = *(wchar_t *)p;

            p++;

        }

        else

        {

            *wp = (wchar_t) *p;

        }

        wp++;

        p++;

    }

    *wp = 0x0000;

    return buff;

}


char* JGUtil::Unicode2MBCS(char* buff, const wchar_t* str)

{

    wchar_t * wp = (wchar_t *)str;

    char * p = buff, * tmp;

    while(*wp){

        tmp = (char *)wp;

        if(*wp & 0xFF00){

            *p = *tmp;

            p++;tmp++;

            *p = *tmp;

            p++;

        }

        else

        {

            *p = *tmp;

            p++;

        }

        wp++;

    }

    *p = 0x00;

    return buff;

}




std::wstring JGUtil::str2wstr(std::string str)

{

    size_t len = str.size();

    wchar_t * b = (wchar_t *)malloc((len+1)*sizeof(wchar_t));

    MBCS2Unicode(b,str.c_str());

    std::wstring r(b);

    free(b);

    return r;

}


std::string JGUtil::wstr2str(std::wstring wstr)

{

    size_t len = wstr.size();

    char * b = (char *)malloc((2*len+1)*sizeof(char));

    Unicode2MBCS(b,wstr.c_str());

    std::string r(b);

    free(b);

    return r;

}


int JGUtil::wputs(std::wstring wstr)

{

    wputs(wstr.c_str());

    return 0;

}


int JGUtil::wputs(const wchar_t * wstr)

{

    int len = wcslen(wstr);

    char * buff = (char *)malloc((len * 2 + 1)*sizeof(char));

    Unicode2MBCS(buff,wstr);

    printf("%s",buff);

    free(buff);

    return 0;

}


wchar_t* JGUtil::UTF8ToUnicode(const char* str)

{

//    int textlen;

//    wchar_t* result;

//    textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1, NULL,0 );

//    result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));

//    memset(result,0,(textlen+1)*sizeof(wchar_t));

//    MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen );

//    return result; 

}


char* JGUtil::UnicodeToUTF8(const wchar_t* str)

{

//    char* result;

//    int textlen;

//    textlen = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );

//    result =(char *)malloc((textlen+1)*sizeof(char));

//    memset(result, 0, sizeof(char) * ( textlen + 1 ) );

//    WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );

//    return result;

}


std::string& JGUtil::replace_all(std::string&   str,const   std::string&   old_value,const   std::string&   new_value)

{

    while(true)   {

        std::string::size_type   pos(0);

        if(   (pos=str.find(old_value))!=string::npos   )

            str.replace(pos,old_value.length(),new_value);

        else   break;

    }

    return   str;

}

std::string& JGUtil::replace_all_distinct(std::string&   str,const   std::string&   old_value,const   std::string&   new_value)

{

    for(string::size_type   pos(0);   pos!=string::npos;   pos+=new_value.length())   {

        if(   (pos=str.find(old_value,pos))!=string::npos   )

            str.replace(pos,old_value.length(),new_value);

        else   break;

    }

    return   str;

}


int JGUtil::getUtf8CNLength(const std::string &src, unsigned size )

{

    size_t i = 0;

    int count = 0;

    for ( ;i < src.length(); )

    {

        int inc = utf8_step ( src[i] );

        

        if ( 0 >= inc ) break;

        

        i += inc;

        

        if(inc > 1)

            count ++;

        if ( size <= i ) break;

    }

    

    return count;

}


int JGUtil::getUtf8Length(const std::string &src, unsigned size )

{

    size_t i = 0;

    int count = 0;

    for ( ;i < src.length(); )

    {

        int inc = utf8_step ( src[i] );

        

        if ( 0 >= inc ) break;

        

        i += inc;

        

        count ++;

        if ( size <= i ) break;

    }

    

    return count;

}


std::string JGUtil::truncUtf8 ( const std::string& src, unsigned size )

{

    if ( src.length() <= size ) return src;

    

    int utf8CNLen = getUtf8CNLength(src, size);

    if(utf8CNLen > 2)

    {//有中文时直接加大些,中文显示的宽度跟英文的有差别

        size = MIN(size + ceil(utf8CNLen*2/3) + 1, (int)src.length());

    }

    

    size_t i = 0;

    

    for ( ;i < src.length(); )

    {

        int inc = utf8_step ( src[i] );

        

        if ( 0 >= inc ) break;

        

        i += inc;

        

        if ( size <= i ) break;

    }

    

    std::string str = src.substr ( 0, i );

    

    return str;

}


int JGUtil::utf8_step(char b0)

{

    if ( (b0 & 0x80) == 0 )

        return 1;

    if ((b0 & 0xC0) != 0xC0)

        return 0;

    if ((b0 & 0xE0) == 0xC0)

        return 2;

    if ((b0 & 0xF0) == 0xE0)

        return 3;

    if ((b0 & 0xF8) == 0xF0)

        return 4;

    return 0;

};


std::string JGUtil::getYearMonthDay()

{

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

    

    struct timeval now;

    struct tm* time;

    

    gettimeofday(&now, NULL);

    

    

    time = localtime(&now.tv_sec);

    int year = time->tm_year + 1900;

//    log("year = %d",year);

    

    char date[32] = {0};

    sprintf(date, "%d-%02d-%02d",(int)time->tm_year + 1900,(int)time->tm_mon + 1,(int)time->tm_mday);

//    log("%s",date);

    return StringUtils::format("%s",date);

    

#endif

    

#if ( CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 )

    

    struct tm* tm;

    time_t timep;

    time(timep);

    

    tm = localtime(&timep);

    char date[32] = {0};

    sprintf(date, "%d-%02d-%02d",(int)time->tm_year + 1900,(int)time->tm_mon + 1,(int)time->tm_mday);

//    log("%s",date);

    return StringUtils::format("%s",date);

    

#endif

}


int JGUtil::getWeekday()

{

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

    struct timeval now;

    struct tm* time;

    gettimeofday(&now, NULL);

    time = localtime(&now.tv_sec);

    return time->tm_wday;

    

#endif

    

#if ( CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 )

    struct tm* tm;

    time_t timep;

    time(timep);

    tm = localtime(&timep);

    return time->tm_wday;

#else

    return 0;

#endif

}


std::string JGUtil::getHourMinute()

{

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

    struct timeval now;

    struct tm* time;

    gettimeofday(&now, NULL);

    time = localtime(&now.tv_sec);

    int year = time->tm_year + 1900;

    char date[32] = {0};

    sprintf(date, "%02d:%02d",(int)time->tm_hour,(int)time->tm_min);

    return StringUtils::format("%s",date);

    

#endif

    

#if ( CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 )

    struct tm* tm;

    time_t timep;

    time(timep);

    tm = localtime(&timep);

    char date[32] = {0};

    sprintf(date, "%02d:%02d",(int)time->tm_hour,(int)time->tm_min);

    return StringUtils::format("%s",date);

#endif

    

    

}


std::string JGUtil::getNumberStr(int count)

{

    float wan = count*1.0f/10000;

    float yi = wan/10000;

    

    

//    std::string str = "";

//    std::stringstream stream;

//    if(yi > 0)

//    {

//        stream<<yi;

//        str += stream.str() + "亿";

//    }

//    else if(wan > 0)

//    {

//        stream<<wan;

//        str += stream.str() + "";

//    }else

//    {

//        stream<<count;

//        str += stream.str();

//    }

    char * data = NULL;

    data = (char *)malloc(20);

    if(yi >= 1)

    {

        sprintf(data, "%.2f亿", yi);

    }else if(wan >= 1)

    {

        sprintf(data, "%.2f", wan);

    }else{

        sprintf(data, "%d", count);

    }

    std::string str = std::string(data);

    free(data);

    return str;

}


//从秒转换为时分秒

std::string JGUtil::secondTohms(int m)

{

    int shi,fen,miao;

    std::string result = "";

    shi = m/3600;

    

    fen = m/60%60;

    miao = m%60;

    result = StringUtils::format("%02d:%02d:%02d",shi,fen,miao);

    return result;

}


std::string JGUtil::getCNNumber(std::string &number)

{

    std::string ret = "";

    int totalLen = (int)number.length();

    for(int i = 0; i < totalLen; i++)

    {

        std::string tempStr = getCharCNNumber(number.at(i));

        

        int delta = totalLen - i;

        ret += tempStr;

        if(delta == 5)

            ret += "";

        else if(delta == 4)

            ret += "";

        else if(delta == 3)

            ret += "";

        else if(delta == 2)

            ret += "";

    }

    return ret;

}


std::string JGUtil::getCharCNNumber(char cnum)

{

    std::string ret = "";

    if(cnum == '1')

    {

        ret = "";

    }else if(cnum == '2')

    {

        ret = "";

    }else if(cnum == '3')

    {

        ret = "";

    }

    else if(cnum == '4')

    {

        ret = "";

    }

    else if(cnum == '5')

    {

        ret = "";

    }

    else if(cnum == '6')

    {

        ret = "";

    }

    else if(cnum == '7')

    {

        ret = "";

    }

    else if(cnum == '8')

    {

        ret = "";

    }

    else if(cnum == '9')

    {

        ret = "";

    }

    return ret;

}


int64_t JGUtil::getSystemTime()

{

    struct timeval tv;

    gettimeofday(&tv,NULL);

    return ((int64_t)tv.tv_sec) * 1000 + tv.tv_usec / 1000;

}


long long JGUtil::getSystemTimeSec()

{

    timeval time;

    gettimeofday(&time, nullptr);

    return  ((long long)time.tv_sec);

}


struct tm* JGUtil::getTimeInfo(long duration)

{

    time_t time_sec = time_t(duration);


    struct tm * t;

    

    t = localtime(&time_sec);

    //int nMinute = tm->tm_min;

    //int nSecond = tm->tm_sec;

    //int nHour = tm->tm_hour;

    //int day = tm->tm_mday;

    //int month = tm->tm_mon;

    

    return t;

}


bool JGUtil::isMonthEnd(int year, int month, int day)

{

    switch(month) {

        case 1:

        case 3:

        case 5:

        case 7:

        case 8:

        case 10:

        case 12:

            if (day == 31) {

                return true;

            }

            return false;

        case 4:

        case 6:

        case 9:

        case 11:

            if (day == 30) {

                return true;

            }

            return false;

        case 2:

            if (isLeapYear(year) && day == 29) {

                return true;

            }

            else if (!isLeapYear(year) && day == 28) {

                return true;

            }

            return false;

        default:

            return false;

    }

}


bool JGUtil::isLeapYear(int year)

{

    if(year%4 == 0 && (year%100 !=0 || year%400==0))

        return true;

    return false;

}


int JGUtil::getDaysInMonth(int year , int month)

{

    int days;

    for(int i = 1; i < month; i++)

    {

        switch(month) {

            case 1:

            case 3:

            case 5:

            case 7:

            case 8:

            case 10:

            case 12:

                days += 31;

                break;

            case 4:

            case 6:

            case 9:

            case 11:

                days += 30;

                break;

            case 2:

                if (isLeapYear(year)) {

                    days += 29;//闰年

                }

                else if (!isLeapYear(year)) {

                    days += 28;

                }

                break;

        }

    }

    return days;

}



int JGUtil::getDaysOfMonthInYear(int year ,int month)

{

    int days=30;


    switch(month)

    {

        case 1:

        case 3:

        case 5:

        case 7:

        case 8:

        case 10:

        case 12:

            days = 31;

            break;

        case 4:

        case 6:

        case 9:

        case 11:

            days = 30;

            break;

        case 2:

            if (isLeapYear(year)) {

                days = 29;//闰年

            }

            else if (!isLeapYear(year)) {

                days = 28;

            }

            break;

    }


    return days;

}

string JGUtil::trim(string &s)

{

    if(s.empty())

    {

        return s;

    }

    s.erase(0,s.find_first_not_of(" "));

    s.erase(s.find_last_not_of(" ") + 1);

    return s;

}



unsigned char JGUtil::ToHex(unsigned char x)

{

    return  x > 9 ? x + 55 : x + 48;

}


unsigned char JGUtil::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';

    else assert(0);

    return y;

}

//url编码

std::string JGUtil::UrlEncode(const std::string& str)

{

    std::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;

}

//url解码

std::string JGUtil::UrlDecode(const std::string& str)

{

    std::string strTemp = "";

    size_t length = str.length();

    for (size_t i = 0; i < length; i++)

    {

        if (str[i] == '+') strTemp += ' ';

        else if (str[i] == '%')

        {

            assert(i + 2 < length);

            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;

}


int JGUtil::getRandomInt(int min,int max)

{

    float i = CCRANDOM_0_1()*(max-min+1)+min;

    return (int)i;


}


std::string JGUtil::getNewDate(int year,int month,int day,int diffDays)

{

    int mYear,mMonth,mDay;

    int normalMonthDays[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    

    mYear = year;

    mMonth = month;

    mDay = day;

    

    //1.get years (days >=366 or 365)

    int daysAyear = 365;

    if(isLeapYear(mYear))

    {//if leap year

        daysAyear = 366;

    }

    while(diffDays/daysAyear)

    {

        diffDays = diffDays - daysAyear;

        mYear ++;

        if(isLeapYear(mYear))

        {

            daysAyear = 366;

        }

    }

    

    //2.get months (days < 366 or 365)

    if(isLeapYear(mYear))

    {

        normalMonthDays[2]=29;

    }

    while(diffDays/normalMonthDays[mMonth])

    {

        diffDays = diffDays - normalMonthDays[mMonth];

        mMonth++;

        if(mMonth >= 13)

        {

            mYear++;

            if(isLeapYear(mYear))

            {

                normalMonthDays[2]=29;

            }

            mMonth = mMonth%12;

        }

    }

    

    //3.get days

    if(isLeapYear(mYear))

    {

        normalMonthDays[2]=29;

    }

    if(diffDays + mDay <= normalMonthDays[mMonth])

        mDay = diffDays + mDay;

    else

    {

        mDay = diffDays + mDay - normalMonthDays[mMonth];

        mMonth++;

        if(mMonth > 12)

        {

            mYear++;

            mMonth = mMonth%12;

        }

    }

    

    char date[32] = {0};

    sprintf(date, "%d-%02d-%02d",mYear,mMonth,mDay);

    return StringUtils::format("%s",date);

}


std::string JGUtil::getNewString(std::string str,int startP,int no,std::string reStr)

{

    string strTemp = "";

    strTemp = str.replace(startP, no, reStr);

    return strTemp;

}


Node* JGUtil::findNodeByName(Node* root, const std::string& name)

{

    if (!root)

    {

        return nullptr;

    }

    if (root->getName() == name)

    {

        return root;

    }

    const auto& arrayRootChildren = root->getChildren();

    for (auto& subWidget : arrayRootChildren)

    {

        Node* child = dynamic_cast<Node*>(subWidget);

        if (child)

        {

            Node* res = findNodeByName(child,name);

            if (res != nullptr)

            {

                return res;

            }

        }

    }

    return nullptr;

}


std::string JGUtil::repleceByChar(std::string str,char finChar,char repChar)

{

    int len = (int)str.length();

    for (int i=0;i<len;i++)

    {

        if (str[i]==finChar)

        {

            str[i]=repChar;

        }

    }

    return trim(str);

}


cocos2d::Color4B JGUtil::int2ccc3(unsigned long color)

{

    Color4B ret;

    ret.r = (color&0xffffffff)>>24;

    ret.g = (color&0xffffff)>>16;

    ret.b = (color&0xffff)>>8;

    ret.a = color&0xff;

    return ret;

}



string JGUtil::getWeekday(int year,int month,int day)//取日期是星期几

{

    string Weekday[7] =

    {

        "星期日","星期一","星期二",

        "星期三","星期四","星期五",

        "星期六"

    };

    int Month[12] =

    {

        31,28,31,30,31,30,31,31,20,31,30,31

    };

    int w,c,y,m;


    if(year > 10000 || year <= 1582)

    {

        year = 2015;

    }

    if( (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ) //判断闰年的情况

    {

        Month[1] = 29;

    }


    if(month > 12 || month <= 0)

    {

        month = 1;

    }

    

    if(day > Month[month - 1] || day <= 0)

    {

        day = 1;

    }

    //使用蔡勒(Zeller)公式计算星期几,1582年后有效

    if( month <= 2)            //1,2 月看做上一年的 1314

    {

        c = (year - 1) / 100;

        y = (year - 1) % 100;

        m = month + 12;

    }

    else

    {

        c = year / 100;

        y = year % 100;

        m = month;

    }

    w = y + y /4 + c / 4 - 2 * c + 26 *(m + 1) / 10 + day -1;

    if(w >=  7)

    {

        w = w % 7;

    }

    else  //被除数为负数的情况

    {

        while(w < 0)

        {

            w = w + 7;

        }

    }


    if( w > 6) w = 0;//星期天,

    return Weekday[w];

}



std::vector<std::string> JGUtil::getFilePathAtVec(std::string filePath)

{

    std::vector<std::string> path_vec;

    std::vector<std::string> temp_vec;

    DIR *dp;

    struct dirent *entry;

    struct stat statbuf;

    bool isDir = true;

    

    if((dp=opendir(filePath.c_str()))==NULL)

    {

        fprintf(stderr,"cannot open %s",filePath.c_str());

        isDir = false;

    }

    

    if (isDir) {

        while((entry=readdir(dp))!=NULL)

        {

            stat(entry->d_name,&statbuf);

            if(strcmp(entry->d_name,".") != 0  &&  strcmp(entry->d_name,"..") != 0)

            {

                //过滤掉隐藏文件

                if(entry->d_name[0]!='.')

                {

                    if (FileUtils::getInstance()->isDirectoryExist(filePath+entry->d_name))

                    {

                        path_vec.push_back(StringUtils::format("%s",entry->d_name));

                    }

                    else

                    {

                        temp_vec.push_back(StringUtils::format("%s",entry->d_name));

                    }

                }

            }

        }

        for (int i = 0; i<temp_vec.size(); i ++)

        {

            path_vec.push_back(temp_vec[i]);

        }

    }

    closedir(dp);

    return path_vec;

}


std::string JGUtil::getPicByFileName(std::string fileName,bool isCloudShare,bool isCloudDir)

{

    std::string filePic = "myJmgo/file_type_unknow.png";

    bool isDirctory =false;/////是否是文件夹

    if (isCloudShare) {

        isDirctory =isCloudDir;

    }else

    {

        isDirctory=FileUtils::getInstance()->isDirectoryExist(fileName);

    }

    if (isDirctory)

    {

        filePic = "myJmgo/folder.png";

    }

    else

    {

        std::string lastName = "";

        if (isCloudShare)

        {

             lastName = fileName;/////是云分享,直接传后缀名,不用调用系统的api

        } else

        {

          lastName = FileUtils::getInstance()->getFileExtension(fileName);

        }

        if (JGUtil::compareNoCase(lastName,".doc"))

        {

            filePic = "myJmgo/file_type_word.png";

        }

        else   if (JGUtil::compareNoCase(lastName, ".bmp") || JGUtil::compareNoCase(lastName,".jpg")|| JGUtil::compareNoCase(lastName,".jpeg")||JGUtil::compareNoCase(lastName,".png")||JGUtil::compareNoCase(lastName,".gif"))

        {

            filePic = "myJmgo/file_type_pic.png";

        }

        else if (JGUtil::compareNoCase(lastName,".apk"))

        {

            filePic = "myJmgo/file_type_apk.png";

        }

        else if (JGUtil::compareNoCase(lastName,".excel"))

        {

            filePic = "myJmgo/file_type_excel.png";

        }

        else if (JGUtil::compareNoCase(lastName,".ppt"))

        {

            filePic = "myJmgo/file_type_ppt.png";

        }

        else if (JGUtil::compareNoCase(lastName,".flac")|| JGUtil::compareNoCase(lastName,".ape")||JGUtil::compareNoCase(lastName,".m3u")|| JGUtil::compareNoCase(lastName,".m4a")||JGUtil::compareNoCase(lastName,".m4b")||JGUtil::compareNoCase(lastName,".m4p")||JGUtil::compareNoCase(lastName,".mp1")||JGUtil::compareNoCase(lastName,".mp2")||JGUtil::compareNoCase(lastName,".mp3")

                 ||JGUtil::compareNoCase(lastName,".mpga")||JGUtil::compareNoCase(lastName,".ogg")||JGUtil::compareNoCase(lastName,".wav")||JGUtil::compareNoCase(lastName,".wma")||JGUtil::compareNoCase(lastName,".aac")||JGUtil::compareNoCase(lastName,".ac3")||JGUtil::compareNoCase(lastName,".amr")||JGUtil::compareNoCase(lastName,".dts")||JGUtil::compareNoCase(lastName,".ra"))

        {

            filePic = "myJmgo/file_type_music.png";

        }

        else if (JGUtil::compareNoCase(lastName,".avi")|| JGUtil::compareNoCase(lastName,".mpg")|| JGUtil::compareNoCase(lastName,".dat")|| JGUtil::compareNoCase(lastName,".vob") || JGUtil::compareNoCase(lastName,".div")||JGUtil::compareNoCase(lastName,".mov") || JGUtil::compareNoCase(lastName,".mkv")|| JGUtil::compareNoCase(lastName,".rm") || JGUtil::compareNoCase(lastName,".3gp") || JGUtil::compareNoCase(lastName,".m4u")

                 || JGUtil::compareNoCase(lastName,".rmvb")|| JGUtil::compareNoCase(lastName,".mp4") || JGUtil::compareNoCase(lastName,".mjpeg") || JGUtil::compareNoCase(lastName,".ts") ||JGUtil::compareNoCase(lastName,".m2ts") || JGUtil::compareNoCase(lastName,".trp") ||JGUtil::compareNoCase(lastName,".wmv")||JGUtil::compareNoCase(lastName,".flv") ||JGUtil::compareNoCase(lastName,".asf")|| JGUtil::compareNoCase(lastName,".m4v")||JGUtil::compareNoCase(lastName,".mpe")||JGUtil::compareNoCase(lastName,".mpeg")|| JGUtil::compareNoCase(lastName,".mpg4")|| JGUtil::compareNoCase(lastName,".rmvb"))

        {

            filePic = "myJmgo/file_type_video.png";

        }

    }

    return filePic;

}


bool JGUtil::checkFileIsFolder(std::string filePath)

{

    bool isDir = false;

    if (FileUtils::getInstance()->isDirectoryExist(filePath))

    {

       isDir = true;

    }

    return isDir;

}


bool JGUtil::deleteFileOrFolder(std::string filePath)

{

    bool isSuccess = false;

    if (FileUtils::getInstance()->isDirectoryExist(filePath))

    {

        if (FileUtils::getInstance()->removeDirectory(filePath+"/"))

        {

            isSuccess = true;

        }

        else

        {

            isSuccess = false;

        }

    }

    else if(FileUtils::getInstance()->isFileExist(filePath))

    {

        if (FileUtils::getInstance()->removeFile(filePath))

        {

            isSuccess = true;

        }

        else

        {

            isSuccess = false;

        }

    }

    return isSuccess;

}


int JGUtil::stoi(const std::string& value)

{

    // Android NDK 10 doesn't support std::stoi a/ std::stoul

#if CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID

    return std::stoi(value);

#else

    return atoi(value.c_str());

#endif

}


std::string JGUtil::timeToDate(long times)

{

    struct tm *l=localtime(&times);

    char buf[128];

    snprintf(buf,sizeof(buf),"%04d-%02d-%02d %02d:%02d:%02d",l->tm_year+1900,l->tm_mon+1,l->tm_mday,l->tm_hour,l->tm_min,l->tm_sec);

    string s(buf);

    return StringUtils::format("%s",s.c_str());

}



long JGUtil::getMondayTime(string strData)

{

    std::string::size_type pos;

    std::vector<std::string> result;

    string pattern = "-";

    strData += pattern;//扩展字符串以方便操作

    size_t size = strData.size();

    

    for(int i = 0; i< size; i++)

    {

        pos = strData.find(pattern,i);

        if(pos < size)

        {

            std::string s = strData.substr(i,pos - i);

            result.push_back(s);

            i = (int)(pos + pattern.size()) - 1;

        }

    }

    if(result.size() != 3)

    {

        return 0;

    }

    int iYear = JGUtil::stoi(result.at(0)) - 1900;

    int iMon = JGUtil::stoi(result.at(1)) - 1;

    int iDay = JGUtil::stoi(result.at(2));

    struct tm t;

    time_t t_of_day;

    t.tm_year = iYear;

    t.tm_mon = iMon;

    t.tm_mday = iDay;

    t.tm_hour = 0;

    t.tm_min = 0;

    t.tm_sec = 0;

    t.tm_isdst = 0;

    t_of_day = mktime(&t);

    struct tm *pTmp =localtime(&t_of_day);

    int day;

    int week = pTmp->tm_wday;

    //log("weekday =========%d",week);

    if(week==0)

        week = 7;

    day = week - 1;

    t_of_day -= day*24*3600;

    return (long)t_of_day;

    

}


std::vector<std::string> JGUtil::splitString(std::string str,std::string pattern)

{

    std::vector<std::string> tempStr;

    char *p;

    char* name = new char[strlen(str.c_str()) + 1];

    sprintf(name, "%s", str.c_str());

    p = strtok(name,pattern.c_str());

    while(p)

    {

        printf("%s\n",p);

        tempStr.push_back(p);

        p=strtok(NULL,pattern.c_str());

    }

    return tempStr;

}


std::string JGUtil::getUrlLocalPath(string strUrl)

{

    //获取FileUtiles对象

    FileUtils *fileUtil=FileUtils::getInstance();

    std::string fileName = strUrl;

    fileName = JGUtil::replace_all(fileName, "/", "_");

    fileName = JGUtil::replace_all(fileName, "\\", "_");

    std::string localDir = fileUtil->getWritablePath()+"movie_ico/";

    std::string localpath = fileUtil->fullPathForFilename(localDir+fileName);

    if(!FileUtils::getInstance()->isFileExist(localpath))

    {

        localpath = "";

    }

    return localpath;

}


std::string JGUtil::getPathTooLang(const std::string& src, unsigned size)

{

    

    if ( src.length() <= size ) return src;

    

    int utf8CNLen = getUtf8CNLength(src, size);

    if(utf8CNLen > 2)

    {//有中文时直接加大些,中文显示的宽度跟英文的有差别

        size = MIN(size, size + ceil(utf8CNLen*2/3) + 1);

    }

    

    size_t i = 0;

    

    for ( ;i < src.length(); )

    {

        int inc = utf8_step ( src[i] );

        

        if ( 0 >= inc ) break;

        

        i += inc;

        

        if ( size <= i ) break;

    }

//    log("1364====%s",src.c_str());

    std::string str = src.substr (0,i);

//    log("1366====%s",str.c_str());

    int pathLen1 = (int)str.length();

    std::string str1 = src.substr (pathLen1,src.length());

//    log("1370====%s",str1.c_str());

    return "..."+str1;

}


// string转小写

std::string  JGUtil::strToLower(std::string str)

{

    std::string strTmp = str;

    transform(strTmp.begin(), strTmp.end(), strTmp.begin(), towupper);

    return strTmp;

}


// string.compareNoCase:不区分大小写

bool JGUtil::compareNoCase(std::string strA,const std::string strB)

{

    string str1 = strToLower(strA);

    string str2 = strToLower(strB);

    return (str1 == str2);

}


void JGUtil::removeAllStudioTouchEvent(Node* node){

    for(auto item : node->getChildren()){

        cocos2d::ui::Widget* w = dynamic_cast<cocos2d::ui::Widget*>(item);

        if(w && w->isTouchEnabled()){

            w->setTouchEnabled(false);

        }

        Node* n = dynamic_cast<Node*>(item);

        if(n){

            removeAllStudioTouchEvent(n);

        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值