Samchon Framework for CPP  1.0.0
StringUtil.cpp
1 #include <samchon/library/StringUtil.hpp>
2 
3 #include <iostream>
4 #include <stdexcept>
5 
6 using namespace std;
7 using namespace samchon;
8 using namespace samchon::library;
9 
10 /* ----------------------------------------------------------------------
11  SUBSTITUTE -> TO_STRING, TO_SQL
12 ---------------------------------------------------------------------- */
13 //TO_STRING
14 template<> auto StringUtil::toString(const WeakString &str) -> string
15 {
16  return str.str();
17 }
18 
19 //TO_SQL
20 template<> auto StringUtil::toSQL(const bool &flag) -> string
21 {
22  return toString(flag);
23 }
24 template<> auto StringUtil::toSQL(const char &val) -> string
25 {
26  return toSQL(string({val}));
27 }
28 auto StringUtil::toSQL(const char *ptr) -> string
29 {
30  return toSQL(string(ptr));
31 }
32 
33 template<> auto StringUtil::toSQL(const string &str) -> string
34 {
35  return toSQL(WeakString(str));
36 }
37 template<> auto StringUtil::toSQL(const WeakString &wstr) -> string
38 {
39  if (wstr.empty() == true)
40  return "NULL";
41  else
42  {
43  if (wstr.find("'") != string::npos)
44  return "'" + wstr.replaceAll("'", "''") + "'";
45  else
46  return "'" + wstr.str() + "'";
47  }
48 }
49 
50 /* ----------------------------------------------------------------------
51  NUMBER-FORMAT
52  IN MONETARY UNIT, ADD DELIMETER ','
53  COLOR-FORMAT
54 
55  POSITIVE NUMBER IS RED,
56  NEGATIVE NUMBER IS BLUE
57  ZERO IS BLACK
58 ---------------------------------------------------------------------- */
59 auto StringUtil::isNumeric(const string &str) -> bool
60 {
61  try
62  {
63  stoi(str);
64  //stod( replaceAll(str, ",", "") );
65  }
66  catch (const std::exception &)
67  {
68  return false;
69  }
70  catch (...)
71  {
72  return false;
73  }
74 
75  return true;
76 }
77 auto StringUtil::toNumber(const string &str) -> double
78 {
79  string &numStr = replaceAll(str, ",", "");
80  return stod(numStr);
81 }
82 
83 auto StringUtil::numberFormat(double val, int precision) -> string
84 {
85  //IF VALUE IS ZERO OR NULL
86  if (val == 0.0)
87  return "0";
88  else if (val == INT_MIN)
89  return "";
90 
91  string str = "";
92 
93  //SETTING
94  bool isNegative = (val < 0);
95  val = abs(val);
96 
97  int cipher = (int)log10(val) + 1;
98 
99  //PRECISION
100  if (val != (unsigned long long)val)
101  {
102  int pointValue = (int)round((val - (unsigned long long)val) * pow(10.0, (double)precision));
103  str = "." + to_string(pointValue);
104  }
105 
106  //NATURAL NUMBER
107  for (int i = 0; i < cipher; i++)
108  {
109  int num = (int)((unsigned long long)val % (unsigned long long)pow(10.0, i + 1.0)); //TRUNCATE UPPER DIGIT VALUE
110  num = (int)(num / pow(10.0, (double)i));
111 
112  str = (char)(num + '0') + str;
113  if((i + 1) % 3 == 0 && i < cipher - 1)
114  str = "," + str;
115  }
116 
117  //NEGATIVE NUMBER
118  if(isNegative == true)
119  str = "-" + str;
120 
121  return str;
122 }
123 auto StringUtil::percentFormat(double val, int precision) -> string
124 {
125  if (val == INT_MIN)
126  return "";
127  return numberFormat(val * 100, precision) + "%";
128 }
129 
130 auto StringUtil::colorNumberFormat(double value, int precision, double delimiter) -> string
131 {
132  string color;
133 
134  if (value > delimiter) color = "red";
135  else if (value == delimiter) color = "black";
136  else color = "blue";
137 
138  return substitute
139  (
140  "<font color='{1}'>{2}</font>",
141  color,
142  numberFormat(value, precision)
143  );
144 }
145 auto StringUtil::colorPercentFormat(double value, int precision, double delimiter) -> string
146 {
147  string color;
148 
149  if (value > delimiter) color = "red";
150  else if (value == delimiter) color = "black";
151  else color = "blue";
152 
153  return substitute
154  (
155  "<font color='{1}'>{2}</font>",
156  color,
157  percentFormat(value, precision)
158  );
159 }
160 
161 /* ----------------------------------------------------------------------
162  TRIM -> WITH LTRIM & RTRIM
163  IT'S RIGHT, THE TRIM OF ORACLE
164 ---------------------------------------------------------------------- */
165 auto StringUtil::trim(const string &val, const vector<string> &delims) -> string
166 {
167  return WeakString(val).trim(delims).str();
168 }
169 auto StringUtil::ltrim(const string &val, const vector<string> &delims) -> string
170 {
171  return WeakString(val).ltrim(delims).str();
172 }
173 auto StringUtil::rtrim(const string &val, const vector<string> &delims) -> string
174 {
175  return WeakString(val).rtrim(delims).str();
176 }
177 
178 auto StringUtil::trim(const string &str) -> string
179 {
180  return WeakString(str).trim().str();
181 }
182 auto StringUtil::ltrim(const string &str) -> string
183 {
184  return WeakString(str).ltrim().str();
185 }
186 auto StringUtil::rtrim(const string &str) -> string
187 {
188  return WeakString(str).rtrim().str();
189 }
190 
191 auto StringUtil::trim(const string &str, const string &delim) -> string
192 {
193  return WeakString(str).trim(delim).str();
194 }
195 auto StringUtil::ltrim(const string &str, const string &delim)->string
196 {
197  return WeakString(str).ltrim(delim).str();
198 }
199 auto StringUtil::rtrim(const string &str, const string &delim)->string
200 {
201  return WeakString(str).rtrim(delim).str();
202 }
203 
204 /* ----------------------------------------------------------------------
205  EXTRACTORS
206 ---------------------------------------------------------------------- */
207 //FINDERS
208 auto StringUtil::finds(const string &str,
209  const vector<string> &delims, size_t startIndex) -> IndexPair<string>
210 {
211  IndexPair<WeakString> &iPair = WeakString(str).finds(delims, startIndex);
212  return { iPair.getIndex(), iPair.getValue().str() };
213 }
214 auto StringUtil::rfinds(const string &str,
215  const vector<string> &delims, size_t endIndex) -> IndexPair<string>
216 {
217  IndexPair<WeakString> &iPair = WeakString(str).rfinds(delims, endIndex);
218  return { iPair.getIndex(), iPair.getValue().str() };
219 }
220 
221 //SUBSTRING
222 auto StringUtil::substring(const string &str,
223  size_t startIndex, size_t endIndex) -> string
224 {
225  return WeakString(str).substring(startIndex, endIndex).str();
226 }
227 auto StringUtil::between(const string &str,
228  const string &start, const string &end) -> string
229 {
230  return WeakString(str).between(start, end).str();
231 }
232 auto StringUtil::addTab(const string &str, size_t n) -> string
233 {
234  vector<string> &lines = split(str, "\n");
235 
236  string val;
237  string tab;
238  size_t i;
239 
240  val.reserve(val.size() + lines.size());
241  tab.reserve(n);
242 
243  for (i = 0; i < n; i++)
244  tab += "\t";
245 
246  for (i = 0; i < lines.size(); i++)
247  val.append(tab + lines[i] + ((i == lines.size() - 1) ? "" : "\n"));
248 
249  return val;
250 }
251 
252 //SUBSTRINGS
253 auto StringUtil::split(const string &str, const string &delim) -> vector<string>
254 {
255  vector<WeakString> &arr = WeakString(str).split(delim);
256 
257  vector<string> resArray(arr.size());
258  for (size_t i = 0; i < arr.size(); i++)
259  resArray[i] = move(arr[i].str());
260 
261  return resArray;
262 }
263 auto StringUtil::betweens(const string &str,
264  const string &start, const string &end) -> vector<string>
265 {
266  vector<WeakString> &arr = WeakString(str).betweens(start, end);
267 
268  vector<string> resArray(arr.size());
269  for (size_t i = 0; i < arr.size(); i++)
270  resArray[i] = move(arr[i].str());
271 
272  return resArray;
273 }
274 
275 /* ----------------------------------------------------------------------
276  REPLACERS
277 ---------------------------------------------------------------------- */
278 auto StringUtil::toLowerCase(const string &str) -> string
279 {
280  return WeakString(str).toLowerCase();
281 }
282 auto StringUtil::toUpperCase(const string &str) -> string
283 {
284  return WeakString(str).toUpperCase();
285 }
286 
287 auto StringUtil::replaceAll(const string &str,
288  const string &before, const string &after) -> string
289 {
290  return WeakString(str).replaceAll(before, after);
291 }
292 auto StringUtil::replaceAll(const string &str,
293  const vector<pair<string, string>> &pairs) -> string
294 {
295  return WeakString(str).replaceAll(pairs);
296 }
297 auto StringUtil::removeHTMLSpaces(const string &str) -> string
298 {
299  vector<pair<string, string>> pairs =
300  {
301  {"&nbsp;", " "},
302  {"\t", " "},
303  {" ", " "}
304  };
305  return replaceAll(str, pairs);
306 }
auto toLowerCase() const -> std::string
Convert uppercase letters to lowercase.
Definition: WeakString.cpp:491
auto getValue() -> T &
Get reference of value.
Definition: IndexPair.hpp:91
Definition: RWMutex.hpp:4
auto split(const WeakString &delim) const -> std::vector< WeakString >
Generates substrings.
Definition: WeakString.cpp:212
Package of libraries.
Definition: library.hpp:84
auto ltrim(const std::vector< std::string > &delims) const -> WeakString
Removes all designated characters from the beginning of the specified string.
Definition: WeakString.cpp:382
auto rfinds(const std::vector< std::string > &delims, size_t endIndex=SIZE_MAX) const -> IndexPair< WeakString >
Finds last occurence in string.
Definition: WeakString.cpp:141
auto getIndex() const -> size_t
Get index.
Definition: IndexPair.hpp:81
auto finds(const std::vector< std::string > &delims, size_t startIndex=0) const -> IndexPair< WeakString >
Finds first occurence in string.
Definition: WeakString.cpp:121
auto toUpperCase() const -> std::string
Convert uppercase letters to lowercase.
Definition: WeakString.cpp:500
auto trim(const std::vector< std::string > &delims) const -> WeakString
Removes all designated characters from the beginning and end of the specified string.
Definition: WeakString.cpp:374
auto substring(size_t startIndex, size_t size=SIZE_MAX) const -> WeakString
Generates a substring.
Definition: WeakString.cpp:181
auto rtrim(const std::vector< std::string > &delims) const -> WeakString
Removes all designated characters from the end of the specified string.
Definition: WeakString.cpp:390
auto replaceAll(const WeakString &before, const WeakString &after) const -> std::string
Returns a string specified word is replaced.
Definition: WeakString.cpp:418
A pair of index and its value(T)
Definition: IndexPair.hpp:29
auto betweens(const WeakString &start={}, const WeakString &end={}) const -> std::vector< WeakString >
Generates substrings.
Definition: WeakString.cpp:237
auto between(const WeakString &start={}, const WeakString &end={}) const -> WeakString
Generates a substring.
Definition: WeakString.cpp:194
Top level namespace of products built from samchon.
Definition: ByteArray.hpp:7
A string class only references characeters, reference only.
Definition: WeakString.hpp:32