String library.

Dependents:   CheckSum RN41 RealTimeClock TVZ_MU_Seminar ... more

StrLib.cpp

Committer:
AkinoriHashimoto
Date:
2015-10-20
Revision:
7:7bc89a64bfbd
Parent:
5:9afdff23f890

File content as of revision 7:7bc89a64bfbd:

#include "StrLib.h"

long long A2I(string str, unsigned int base)   // Error; rtn '-1'
{
    long long ans= 0;   // 64bit
    int tmp= 0;         // 32bit
    int leng= str.size();   // String Length;
    unsigned int chr;
    for(int i= 0; i < leng; i++) {
        chr= str[leng-1-i];
        if('0'<=chr && '9'>=chr)
            tmp= chr-'0';
        else if('A'<=chr && 'F'>=chr)
            tmp= chr-'A'+0x0A;   // ex. C=12= 2(C-A)+ 10(0x0A)
        else if('a'<=chr && 'f'>=chr)
            tmp= chr-'a'+0x0A;
        else
            return -1;

        ans+= (long long)((double)tmp* pow((double)base,(double)i));
    }
    return ans;
}
string I2A(int num, unsigned int base, unsigned int digitNum)
{
    char tmpChr[33];
    // "%5.5dなどとしたい
    string format= "%";

    // Digit Num.
    if(digitNum > 0) {  // 0以外
        unsigned int tmp;
        tmp= '0'+ digitNum;
        format += tmp;
        format += ".";
        format += tmp;   // +でつなげると、charの和(オーバーフロー)起こす。
    }

    if(     base == 8)
        format += "o";
    else if(base == 10)
        format += "d";
    else if(base == 16)
        format += "x";
    else
        return "ERR; base: Oct, Dec, Hex.";

    sprintf(tmpChr, format.c_str(), num);
    string tmpStr= tmpChr;
    return tmpStr;
}
string I2A(long long num, unsigned int base, unsigned int digitNum)
{
    char tmpChr[33];
    // "%5.5dなどとしたい
    string format= "%";

    // Digit Num.
    if(digitNum > 0) {  // 0以外
        unsigned int tmp;
        tmp= '0'+ digitNum;
        format += tmp;
        format += ".";
        format += tmp;   // +でつなげると、charの和(オーバーフロー)起こす。
    }

    if(     base == 8)
        format += "llo";
    else if(base == 10)
        format += "lld";
    else if(base == 16)
        format += "llx";
    else
        return "ERR; base: Oct, Dec, Hex.";

    sprintf(tmpChr, format.c_str(), num);
    string tmpStr= tmpChr;
    return tmpStr;
}

string F2A(float num, int fieldWidth, int decimalPlaces, bool fill0)
{
    if(!(0<=fieldWidth && fieldWidth<30))
        return "ERR; fieldWidth.";
    if(!(0<=decimalPlaces && decimalPlaces<30) )
        return "ERR; decimalPlaces.";
    if(fieldWidth < decimalPlaces+2)
        return "ERR; fieldWidth < decimalPlaces+2";

    char tmpChr[33];
    string format= "%";
    if(fill0)
        format += "0";
    format += I2A(fieldWidth)+ "."+ I2A(decimalPlaces)+ "f";
    sprintf(tmpChr, format.c_str(), num);
    string tmpStr= tmpChr;
    return tmpStr;
}
string F2A(float num)
{
    char tmpChr[33];
    sprintf(tmpChr, "%f", num);
    string tmpStr= tmpChr;
    return tmpStr;
}

bool strCompare(string trg, string cmp, int idx)
{
    int id= trg.find(cmp, idx);
    if(id == string::npos)
        return false;
    return id == idx;
}
bool strCompareComplete(string trg, string cmp)
{
    int idx= trg.find(cmp);
    if(idx == string::npos)
        return false;
    idx= cmp.find(trg);
    if(idx == string::npos)
        return false;

    return true;
}

string toAlpanumeric(string str, bool toLarge)
{
    string ans= "";
    bool num, small, large;
    for (int i= 0; i < str.size(); i++) {
        num= small= large= false;
        if('0' <= str[i] && str[i] <= '9')
            num= true;
        else if('A' <= str[i] && str[i] <= 'Z')
            large= true;
        else if('a' <= str[i] && str[i] <= 'z')
            small= true;

        if(toLarge && small)
            str[i] -= 0x20;  // small -> large
        if(num || large || small)
            ans += str[i];
    }

    return ans;
}