Akinori Hashimoto / StrLib

Dependents:   CheckSum RN41 RealTimeClock TVZ_MU_Seminar ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers StrLib.cpp Source File

StrLib.cpp

00001 #include "StrLib.h"
00002 
00003 long long A2I(string str, unsigned int base)   // Error; rtn '-1'
00004 {
00005     long long ans= 0;   // 64bit
00006     int tmp= 0;         // 32bit
00007     int leng= str.size();   // String Length;
00008     unsigned int chr;
00009     for(int i= 0; i < leng; i++) {
00010         chr= str[leng-1-i];
00011         if('0'<=chr && '9'>=chr)
00012             tmp= chr-'0';
00013         else if('A'<=chr && 'F'>=chr)
00014             tmp= chr-'A'+0x0A;   // ex. C=12= 2(C-A)+ 10(0x0A)
00015         else if('a'<=chr && 'f'>=chr)
00016             tmp= chr-'a'+0x0A;
00017         else
00018             return -1;
00019 
00020         ans+= (long long)((double)tmp* pow((double)base,(double)i));
00021     }
00022     return ans;
00023 }
00024 string I2A(int num, unsigned int base, unsigned int digitNum)
00025 {
00026     char tmpChr[33];
00027     // "%5.5dなどとしたい
00028     string format= "%";
00029 
00030     // Digit Num.
00031     if(digitNum > 0) {  // 0以外
00032         unsigned int tmp;
00033         tmp= '0'+ digitNum;
00034         format += tmp;
00035         format += ".";
00036         format += tmp;   // +でつなげると、charの和(オーバーフロー)起こす。
00037     }
00038 
00039     if(     base == 8)
00040         format += "o";
00041     else if(base == 10)
00042         format += "d";
00043     else if(base == 16)
00044         format += "x";
00045     else
00046         return "ERR; base: Oct, Dec, Hex.";
00047 
00048     sprintf(tmpChr, format.c_str(), num);
00049     string tmpStr= tmpChr;
00050     return tmpStr;
00051 }
00052 string I2A(long long num, unsigned int base, unsigned int digitNum)
00053 {
00054     char tmpChr[33];
00055     // "%5.5dなどとしたい
00056     string format= "%";
00057 
00058     // Digit Num.
00059     if(digitNum > 0) {  // 0以外
00060         unsigned int tmp;
00061         tmp= '0'+ digitNum;
00062         format += tmp;
00063         format += ".";
00064         format += tmp;   // +でつなげると、charの和(オーバーフロー)起こす。
00065     }
00066 
00067     if(     base == 8)
00068         format += "llo";
00069     else if(base == 10)
00070         format += "lld";
00071     else if(base == 16)
00072         format += "llx";
00073     else
00074         return "ERR; base: Oct, Dec, Hex.";
00075 
00076     sprintf(tmpChr, format.c_str(), num);
00077     string tmpStr= tmpChr;
00078     return tmpStr;
00079 }
00080 
00081 string F2A(float num, int fieldWidth, int decimalPlaces, bool fill0)
00082 {
00083     if(!(0<=fieldWidth && fieldWidth<30))
00084         return "ERR; fieldWidth.";
00085     if(!(0<=decimalPlaces && decimalPlaces<30) )
00086         return "ERR; decimalPlaces.";
00087     if(fieldWidth < decimalPlaces+2)
00088         return "ERR; fieldWidth < decimalPlaces+2";
00089 
00090     char tmpChr[33];
00091     string format= "%";
00092     if(fill0)
00093         format += "0";
00094     format += I2A(fieldWidth)+ "."+ I2A(decimalPlaces)+ "f";
00095     sprintf(tmpChr, format.c_str(), num);
00096     string tmpStr= tmpChr;
00097     return tmpStr;
00098 }
00099 string F2A(float num)
00100 {
00101     char tmpChr[33];
00102     sprintf(tmpChr, "%f", num);
00103     string tmpStr= tmpChr;
00104     return tmpStr;
00105 }
00106 
00107 bool strCompare(string trg, string cmp, int idx)
00108 {
00109     int id= trg.find(cmp, idx);
00110     if(id == string::npos)
00111         return false;
00112     return id == idx;
00113 }
00114 bool strCompareComplete(string trg, string cmp)
00115 {
00116     int idx= trg.find(cmp);
00117     if(idx == string::npos)
00118         return false;
00119     idx= cmp.find(trg);
00120     if(idx == string::npos)
00121         return false;
00122 
00123     return true;
00124 }
00125 
00126 string toAlpanumeric(string str, bool toLarge)
00127 {
00128     string ans= "";
00129     bool num, small, large;
00130     for (int i= 0; i < str.size(); i++) {
00131         num= small= large= false;
00132         if('0' <= str[i] && str[i] <= '9')
00133             num= true;
00134         else if('A' <= str[i] && str[i] <= 'Z')
00135             large= true;
00136         else if('a' <= str[i] && str[i] <= 'z')
00137             small= true;
00138 
00139         if(toLarge && small)
00140             str[i] -= 0x20;  // small -> large
00141         if(num || large || small)
00142             ans += str[i];
00143     }
00144 
00145     return ans;
00146 }