33#include "valueconverter.h"
45Value func_concatenate (valVector args,
ValueCalc *calc, FuncExtra *);
63Value func_substitute (valVector args,
ValueCalc *calc, FuncExtra *);
72void RegisterTextFunctions()
74 FunctionRepository* repo = FunctionRepository::self();
78 f =
new Function (
"CHAR", func_char);
80 f =
new Function (
"CLEAN", func_clean);
82 f =
new Function (
"CODE", func_code);
84 f =
new Function (
"LEN", func_len);
86 f =
new Function (
"LOWER", func_lower);
88 f =
new Function (
"PROPER", func_proper);
90 f =
new Function (
"ROT", func_rot);
92 f =
new Function (
"SLEEK", func_sleek);
94 f =
new Function (
"T", func_t);
96 f =
new Function (
"TOGGLE", func_toggle);
98 f =
new Function (
"TRIM", func_trim);
100 f =
new Function (
"UPPER", func_upper);
102 f =
new Function (
"VALUE", func_value);
106 f =
new Function (
"COMPARE", func_compare);
107 f->setParamCount (3);
109 f =
new Function (
"CONCATENATE", func_concatenate);
110 f->setParamCount (1, -1);
111 f->setAcceptArray ();
113 f =
new Function (
"DOLLAR", func_dollar);
114 f->setParamCount (1, 2);
116 f =
new Function (
"EXACT", func_exact);
117 f->setParamCount (2);
119 f =
new Function (
"FIND", func_find);
120 f->setParamCount (2, 3);
122 f =
new Function (
"FIXED", func_fixed);
123 f->setParamCount (1, 3);
125 f =
new Function (
"LEFT", func_left);
126 f->setParamCount (2);
128 f =
new Function (
"MID", func_mid);
129 f->setParamCount (2, 3);
131 f =
new Function (
"REGEXP", func_regexp);
132 f->setParamCount (2, 4);
134 f =
new Function (
"REGEXPRE", func_regexpre);
135 f->setParamCount (3);
137 f =
new Function (
"REPLACE", func_replace);
138 f->setParamCount (4);
140 f =
new Function (
"REPT", func_rept);
141 f->setParamCount (2);
143 f =
new Function (
"RIGHT", func_right);
144 f->setParamCount (2);
146 f =
new Function (
"SEARCH", func_search);
147 f->setParamCount (2, 3);
149 f =
new Function (
"SUBSTITUTE", func_substitute);
150 f->setParamCount (3, 4);
152 f =
new Function (
"TEXT", func_text);
153 f->setParamCount (1, 2);
161 int val = calc->conv()->asInteger (args[0]).
asInteger ();
162 return Value (TQString (TQChar (val)));
168 TQString str (calc->conv()->asString (args[0]).
asString());
172 int l = str.length();
174 for (i = 0; i < l; ++i)
181 return Value (result);
187 TQString str (calc->conv()->asString (args[0]).
asString());
188 if (str.length() <= 0)
191 return Value (str[0].unicode());
198 bool exact = calc->conv()->asBoolean (args[2]).
asBoolean();
200 TQString s1 = calc->conv()->asString (args[0]).
asString();
201 TQString s2 = calc->conv()->asString (args[1]).
asString();
204 result = s1.lower().localeAwareCompare(s2.lower());
206 result = s1.localeAwareCompare(s2);
213 return Value (result);
220 for (
unsigned int row = 0; row < val.
rows(); ++row)
221 for (
unsigned int col = 0; col < val.
columns(); ++col)
222 func_concatenate_helper (val.
element (col, row), calc, tmp);
224 tmp += calc->conv()->asString (val).
asString();
228Value func_concatenate (valVector args,
ValueCalc *calc, FuncExtra *)
231 for (
unsigned int i = 0; i < args.count(); ++i)
232 func_concatenate_helper (args[i], calc, tmp);
247 double value = calc->conv()->asFloat (args[0]).
asFloat();
249 if (args.count() == 2)
250 precision = calc->conv()->asInteger (args[1]).
asInteger();
253 value = floor (value * pow (10.0, precision) + 0.5) / pow (10.0, precision);
255 TDELocale *locale = calc->conv()->locale();
256 TQString s = locale->formatMoney (value, locale->currencySymbol(), precision);
264 TQString s1 = calc->conv()->asString (args[0]).
asString();
265 TQString s2 = calc->conv()->asString (args[1]).
asString();
266 bool exact = (s1 == s2);
267 return Value (exact);
273 TQString find_text, within_text;
276 find_text = calc->conv()->asString (args[0]).
asString();
277 within_text = calc->conv()->asString (args[1]).
asString();
278 if (args.count() == 3)
279 start_num = calc->conv()->asInteger (args[2]).
asInteger();
285 int pos = within_text.find (find_text, start_num - 1);
288 return Value (pos + 1);
297 bool no_commas =
false;
299 double number = calc->conv()->asFloat (args[0]).
asFloat();
300 if (args.count() > 1)
301 decimals = calc->conv()->asInteger (args[1]).
asInteger();
302 if (args.count() == 3)
303 no_commas = calc->conv()->asBoolean (args[2]).
asBoolean();
306 TDELocale *locale = calc->conv()->locale();
314 decimals = -decimals;
315 number = floor( number/pow(10.0,decimals)+0.5 ) * pow(10.0,decimals);
319 bool neg = number < 0;
320 result = TQString::number( neg ? -number:number,
'f', decimals );
322 int pos = result.find(
'.');
323 if (pos == -1) pos = result.length();
324 else result.replace(pos, 1, locale->decimalSymbol());
326 while (0 < (pos -= 3))
327 result.insert(pos, locale->thousandsSeparator());
329 result.prepend( neg ? locale->negativeSign():
330 locale->positiveSign() );
332 return Value (result);
338 TQString str = calc->conv()->asString (args[0]).
asString();
340 if (args.count() == 2)
341 nb = calc->conv()->asInteger (args[1]).
asInteger();
343 return Value (str.left (nb));
349 int nb = calc->conv()->asString (args[0]).
asString().length();
356 return Value (calc->conv()->asString (args[0]).
asString().lower());
362 TQString str = calc->conv()->asString (args[0]).
asString();
363 int pos = calc->conv()->asInteger (args[1]).
asInteger();
364 uint len = 0xffffffff;
365 if (args.count() == 3)
366 len = (uint) calc->conv()->asInteger (args[2]).
asInteger();
371 return Value (str.mid (pos, len));
377 TQString str = calc->conv()->asString (args[0]).
asString().lower();
382 for (
unsigned int i = 0; i < str.length(); ++i)
398 if (str[i] ==
' ' || str[i] ==
'-')
409 TQRegExp exp (calc->conv()->asString (args[1]).
asString());
413 TQString s = calc->conv()->asString (args[0]).
asString();
415 if (args.count() > 2)
416 defText = calc->conv()->asString (args[2]).
asString();
418 if (args.count() == 4)
419 bkref = calc->conv()->asInteger (args[3]).
asInteger();
423 TQString returnValue;
425 int pos = exp.search (s);
427 returnValue = defText;
429 returnValue = exp.cap (bkref);
431 return Value (returnValue);
438 TQRegExp exp (calc->conv()->asString (args[1]).
asString());
442 TQString s = calc->conv()->asString (args[0]).
asString();
443 TQString str = calc->conv()->asString (args[2]).
asString();
446 while ((pos = exp.search (s, pos)) != -1)
448 int i = exp.matchedLength();
449 s = s.replace (pos, i, str);
459 TQString text = calc->conv()->asString (args[0]).
asString();
460 int pos = calc->conv()->asInteger (args[1]).
asInteger();
461 int len = calc->conv()->asInteger (args[2]).
asInteger();
462 TQString new_text = calc->conv()->asString (args[3]).
asString();
464 if (pos < 0) pos = 0;
466 TQString result = text.replace (pos-1, len, new_text);
467 return Value (result);
473 TQString s = calc->conv()->asString (args[0]).
asString();
474 int nb = calc->conv()->asInteger (args[1]).
asInteger();
477 for (
int i = 0; i < nb; i++) result += s;
478 return Value (result);
484 TQString str = calc->conv()->asString (args[0]).
asString();
486 if (args.count() == 2)
487 nb = calc->conv()->asInteger (args[1]).
asInteger();
489 return Value (str.right (nb));
495 TQString text = calc->conv()->asString (args[0]).
asString();
497 for(
unsigned i=0; i<text.length(); i++ )
499 unsigned c = text[i].upper().unicode();
500 if( ( c >=
'A' ) && ( c <=
'M' ) )
501 text[i] = TQChar( text[i].unicode() + 13);
502 if( ( c >=
'N' ) && ( c <=
'Z' ) )
503 text[i] = TQChar( text[i].unicode() - 13);
512 TQString find_text = calc->conv()->asString (args[0]).
asString();
513 TQString within_text = calc->conv()->asString (args[1]).
asString();
515 if (args.count() == 3)
516 start_num = calc->conv()->asInteger (args[2]).
asInteger();
523 TQRegExp regex( find_text,
false,
true );
524 int pos = within_text.find( regex, start_num-1 );
527 return Value (pos + 1);
533 TQString str = calc->conv()->asString (args[0]).
asString();
537 int l = str.length();
539 for (i = 0; i < l; ++i)
546 return Value (result);
550Value func_substitute (valVector args,
ValueCalc *calc, FuncExtra *)
555 if (args.count() == 4)
557 num = calc->conv()->asInteger (args[3]).
asInteger();
561 TQString text = calc->conv()->asString (args[0]).
asString();
562 TQString old_text = calc->conv()->asString (args[1]).
asString();
563 TQString new_text = calc->conv()->asString (args[2]).
asString();
566 if (old_text.length() == 0)
return Value (text);
568 TQString result = text;
570 int p = result.find (old_text);
571 while ((p != -1) && (num > 0))
573 result.replace( p, old_text.length(), new_text );
575 p = result.find (old_text, p + new_text.length());
579 return Value (result);
585 return calc->conv()->asString (args[0]);
593 return calc->conv()->asString (args[0]);
599 TQString str = calc->conv()->asString (args[0]).
asString();
601 int l = str.length();
603 for (i = 0; i < l; ++i)
606 TQChar lc = c.lower();
607 TQChar uc = c.upper();
622 calc->conv()->asString (args[0]).
asString().simplifyWhiteSpace());
628 return Value (calc->conv()->asString (args[0]).
asString().upper());
635 return calc->conv()->asFloat (args[0]);
The ValueCalc class is used to perform all sorts of calculations.
Provides a wrapper for cell value.
unsigned columns() const
If this value is an array, return the number of columns.
Value element(unsigned column, unsigned row) const
Return an element in the array value.
unsigned rows() const
If this value is an array, return the number of rows.
bool isArray() const
Returns true if the type of this value is array.
double asFloat() const
Returns the floating-point value of this value.
long asInteger() const
Returns the integer value of this value.
TQString asString() const
Returns the string value of this value.
static const Value & errorVALUE()
Returns constant reference to #VALUE! error.
bool asBoolean() const
Returns the boolean value of this value.
static const Value & errorNA()
Returns constant reference to #N/A error.