21#include "valueparser.h"
23#include "kspread_cell.h"
24#include "kspread_format.h"
25#include "kspread_locale.h"
26#include "kspread_value.h"
34TDELocale* ValueParser::locale()
47 if ( str.isEmpty() || format == Text_format || str.at(0)==
'\'' )
53 TQString strStripped = str.stripWhiteSpace();
58 if (tryParseNumber (strStripped, cell))
62 if (tryParseBool (strStripped, cell))
68 double money = parserLocale->readMoney (strStripped, &ok);
71 cell->
format()->setPrecision(2);
78 if (tryParseDate (strStripped, cell))
81 if (tryParseTime (strStripped, cell))
96 if ( str.isEmpty() || str.at(0)==
'\'' )
104 TQString strStripped = str.stripWhiteSpace();
108 val = tryParseNumber (strStripped, &ok);
115 val = tryParseBool (strStripped, &ok);
121 double money = parserLocale->readMoney (strStripped, &ok);
129 val = tryParseDate (strStripped, &ok);
133 val = tryParseTime (strStripped, &ok);
142bool ValueParser::tryParseBool (
const TQString& str,
Cell *cell)
145 Value val = tryParseBool (str, &ok);
151bool ValueParser::tryParseNumber (
const TQString& str,
Cell *cell)
154 Value val = tryParseNumber (str, &ok);
160bool ValueParser::tryParseDate (
const TQString& str,
Cell *cell)
163 Value value = tryParseDate (str, &ok);
169bool ValueParser::tryParseTime (
const TQString& str,
Cell *cell)
172 Value value = tryParseTime (str, &ok);
179Value ValueParser::tryParseBool (
const TQString& str,
bool *ok)
184 const TQString& lowerStr = str.lower();
186 if ((lowerStr ==
"true") ||
187 (lowerStr == parserLocale->translate(
"true").lower()))
192 else if ((lowerStr ==
"false") ||
193 (lowerStr == parserLocale->translate(
"false").lower()))
197 fmtType = Number_format;
204 TQString str = _str.stripWhiteSpace();
205 bool neg = str.find(parserLocale->negativeSign()) == 0;
207 str.remove( 0, parserLocale->negativeSign().length() );
212 TQString exponentialPart;
215 EPos = str.find(
'E', 0,
false);
219 exponentialPart = str.mid(EPos);
220 str = str.left(EPos);
223 int pos = str.find(parserLocale->decimalSymbol());
229 if (isInt) *isInt =
true;
233 major = str.left(pos);
234 minor = str.mid(pos + parserLocale->decimalSymbol().length());
235 if (isInt) *isInt =
false;
239 int thlen = parserLocale->thousandsSeparator().length();
241 while ( ( pos = major.find( parserLocale->thousandsSeparator() ) ) > 0 )
244 int fromEnd = major.length() - pos;
245 if ( fromEnd % (3+thlen) != 0
248 || (lastpos>0 && pos-lastpos!=3))
255 major.remove( pos, thlen );
257 if (lastpos>0 && major.length()-lastpos!=3)
266 tot += major +
'.' + minor + exponentialPart;
268 return tot.toDouble(ok);
271Value ValueParser::tryParseNumber (
const TQString& str,
bool *ok)
275 bool percent =
false;
277 if( str.at(str.length()-1)==
'%')
279 str2 = str.left (str.length()-1).stripWhiteSpace();
292 val = str2.toDouble(ok);
293 if (str.contains(
'.'))
307 fmtType = Percentage_format;
314 value.
setValue (
static_cast<long> (val));
318 if ( str2.contains(
'E') || str2.contains(
'e') )
319 fmtType = Scientific_format;
323 fmtType = Scientific_format;
325 fmtType = Number_format;
333Value ValueParser::tryParseDate (
const TQString& str,
bool *ok)
336 TQDate tmpDate = parserLocale->readDate (str, &valid);
344 TQString fmt = parserLocale->dateFormatShort();
345 int yearPos = fmt.find (
"%Y", 0,
false);
351 while ( fmt[0] !=
'%' )
355 fmt.remove( yearPos, 2 );
356 for ( ; yearPos > 0 && fmt[yearPos-1] !=
'%'; --yearPos )
357 fmt.remove( yearPos, 1 );
360 tmpDate = parserLocale->readDate( str, fmt, &valid );
372 TQString fmt = parserLocale->dateFormatShort();
373 if( ( fmt.contains(
"%y" ) == 1 ) && ( tmpDate.year() > 2999 ) )
374 tmpDate = tmpDate.addYears( -1900 );
384 if( ( tmpDate.year() >= 2030 ) && ( tmpDate.year() <= 2069 ) )
386 TQString yearFourDigits = TQString::number( tmpDate.year() );
387 TQString yearTwoDigits = TQString::number( tmpDate.year() % 100 );
391 if( ( str.contains( yearTwoDigits ) >= 1 ) &&
392 ( str.contains( yearFourDigits ) == 0 ) )
393 tmpDate = tmpDate.addYears( -100 );
397 if (parserLocale->formatDate (tmpDate,
false) == str)
398 fmtType = TextDate_format;
400 fmtType = ShortDate_format;
405 tmpDate = TQDate::fromString(str,TQt::ISODate);
406 if (tmpDate.isValid())
415 return Value (tmpDate);
418Value ValueParser::tryParseTime (
const TQString& str,
bool *ok)
424 bool duration =
false;
427 TQDateTime tmpTime =
readTime (str,
true, &valid, duration);
428 if (!tmpTime.isValid())
429 tmpTime =
readTime (str,
false, &valid, duration);
434 if (parserLocale->use12Clock())
436 TQString stringPm = parserLocale->translate(
"pm");
437 TQString stringAm = parserLocale->translate(
"am");
439 if((pos=str.find(stringPm))!=-1)
441 TQString tmp=str.mid(0,str.length()-stringPm.length());
442 tmp=tmp.simplifyWhiteSpace();
443 tm = parserLocale->readTime(tmp+
" "+stringPm, &valid);
445 tm = parserLocale->readTime(tmp+
":00 "+stringPm, &valid);
447 else if((pos=str.find(stringAm))!=-1)
449 TQString tmp = str.mid(0,str.length()-stringAm.length());
450 tmp = tmp.simplifyWhiteSpace();
451 tm = parserLocale->readTime (tmp +
" " + stringAm, &valid);
453 tm = parserLocale->readTime (tmp +
":00 " + stringAm, &valid);
461 fmtType = Time_format;
465 fmtType = Time_format7;
478 bool *ok,
bool & duration)
481 TQString str = intstr.simplifyWhiteSpace().lower();
482 TQString format = parserLocale->timeFormat().simplifyWhiteSpace();
485 int n = format.find(
"%S");
486 format = format.left( n - 1 );
490 int hour = -1, minute = -1;
491 int second = withSeconds ? -1 : 0;
497 TQDate refDate( 1899, 12, 31 );
499 uint l = format.length();
500 uint sl = str.length();
502 while (l > formatpos || sl > strpos)
504 if ( !(l > formatpos && sl > strpos) )
507 TQChar c( format.at( formatpos++ ) );
513 else if (c != str.at(strpos++))
519 if (sl > strpos && str.at( strpos).isSpace() )
522 c = format.at( formatpos++ );
528 s = parserLocale->translate(
"pm").lower();
529 int len = s.length();
530 if (str.mid(strpos, len) == s)
537 s = parserLocale->translate(
"am").lower();
539 if (str.mid(strpos, len) == s)
558 days = (int)(hour / 24);
568 if (hour < 1 || hour > 12)
575 if (minute < 0 || minute > 59)
582 if (second < 0 || second > 59)
597 refDate.addDays( days );
603 return TQDateTime( refDate, TQTime( hour, minute, second ) );
609 return TQDateTime( refDate, TQTime( -1, -1, -1 ) );
620 if (!str.at(pos).isDigit())
623 for ( ; str.length() > pos && str.at(pos).isDigit(); pos++ )
626 result += str.at(pos).digitValue();
For every cell in the spread sheet there is a Cell object.
FormatType formatType() const
Return the format of this cell.
void setValue(const Value &value)
Sets the value for this cell.
Format * format() const
Returns the format object of this cell.
TQDateTime readTime(const TQString &intstr, bool withSeconds, bool *ok, bool &duration)
converts a string to a date/time value
void parse(const TQString &str, Cell *cell)
try to parse the text in a given cell and set value accordingly
ValueParser(TDELocale *locale)
constructor
double readNumber(const TQString &_str, bool *ok, bool *isInt)
a helper function to read numbers and distinguish integers and FPs
int readInt(const TQString &str, uint &pos)
a helper function to read integers
Provides a wrapper for cell value.
void setFormat(Format fmt)
Sets format information for this value.
void setValue(const Value &v)
Sets this value to another value.