21#include "valueformatter.h"
23#include "kspread_cell.h"
24#include "kspread_locale.h"
25#include "kspread_util.h"
26#include "valueconverter.h"
28#include <kcalendarsystem.h>
43 if (cell->hasError ())
44 return errorFormat (cell);
48 Format::FloatFormat floatFormat =
49 cell->format()->floatFormat (cell->column(), cell->row());
50 int precision = cell->format()->precision (cell->column(), cell->row());
51 TQString prefix = cell->format()->prefix (cell->column(), cell->row());
52 TQString postfix = cell->format()->postfix (cell->column(), cell->row());
53 Format::Currency currency;
54 bool valid = cell->format()->currencyInfo(currency);
55 TQString currencySymbol = valid ? currency.symbol : TQString();
57 return formatText (cell->value(), fmtType, precision,
58 floatFormat, prefix, postfix, currencySymbol);
62 FormatType fmtType, int precision, Format::FloatFormat floatFormat,
63 const TQString &prefix, const TQString &postfix, const TQString ¤cySymbol)
68 floatFormat, prefix, postfix, currencySymbol);
78 if (fmtType == Text_format)
80 str = converter->asString (value).asString();
81 if (!str.isEmpty() && str[0]== '\'' )
86 else if (formatIsDate (fmtType))
90 else if (formatIsTime (fmtType))
94 else if (formatIsFraction (fmtType))
101 double v = converter->asFloat (value).asFloat();
104 if ((floatFormat == Format::AlwaysUnsigned) && (v < 0.0))
109 (floatFormat == Format::AlwaysSigned), currencySymbol);
115 TQChar decimal_point = converter->locale()->decimalSymbol()[0];
116 if ( decimal_point.isNull() )
123 if (!prefix.isEmpty())
124 str = prefix + ' ' + str;
126 if( !postfix.isEmpty())
127 str += ' ' + postfix;
141 if (fmtType == Text_format)
145 if (fmtType == Generic_format)
148 Value::Format fmt = value. format();
150 case Value::fmt_None:
151 fmtType = Text_format;
153 case Value::fmt_Boolean:
154 fmtType = Text_format;
156 case Value::fmt_Number:
158 fmtType = Scientific_format;
160 fmtType = Number_format;
162 case Value::fmt_Percent:
163 fmtType = Percentage_format;
165 case Value::fmt_Money:
166 fmtType = Money_format;
168 case Value::fmt_DateTime:
169 fmtType = TextDate_format;
171 case Value::fmt_Date:
172 fmtType = ShortDate_format;
174 case Value::fmt_Time:
175 fmtType = Time_format;
177 case Value::fmt_String:
179 fmtType = Text_format;
204 if (str.find (decimal_point) < 0)
209 int cslen = converter->locale()->currencySymbol().length();
210 if (str.find ( '%') != -1)
212 else if (str.find (converter->locale()->currencySymbol()) ==
213 (( int) (str.length() - cslen)))
215 else if ((start = str.find ( 'E')) != -1)
216 start = str.length() - start;
220 int i = str.length() - start;
221 bool bFinished = false;
222 while ( !bFinished && i > 0 )
224 TQChar ch = str[i - 1];
230 if (ch == decimal_point)
237 FormatType fmt, bool alwaysSigned, const TQString& currencySymbol)
242 int p = (precision == -1) ? 8 : precision;
243 TQString localizedNumber;
247 if (fmt == Percentage_format)
251 if( fabs( value ) < DBL_EPSILON ) value = 0.0;
255 if( fmt != Scientific_format )
257 double m[] = { 1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10 };
258 double mm = (p > 10) ? pow(10.0,p) : m[p];
259 bool neg = value < 0;
260 value = floor( fabs(value)*mm + 0.5 ) / mm;
261 if( neg ) value = -value;
264 TQChar decimal_point;
268 localizedNumber = converter->locale()->formatNumber(value, p);
270 case Percentage_format:
271 localizedNumber = converter->locale()->formatNumber (value, p)+ " %";
274 localizedNumber = converter->locale()->formatMoney (value,
275 currencySymbol.isEmpty() ? converter->locale()->currencySymbol() : currencySymbol, p );
277 case Scientific_format:
278 decimal_point = converter->locale()->decimalSymbol()[0];
279 localizedNumber = TQString::number (value, 'E', p);
280 if ((pos = localizedNumber.find ( '.')) != -1)
281 localizedNumber = localizedNumber.replace (pos, 1, decimal_point);
286 kdDebug(36001)<< "Wrong usage of ValueFormatter::createNumberFormat fmt=" << fmt << "\n";
291 if (alwaysSigned && value >= 0 )
292 if (converter->locale()->positiveSign().isEmpty())
293 localizedNumber= '+'+localizedNumber;
295 return localizedNumber;
300 double result = value - floor(value);
306 return TQString::number(value);
312 case fraction_quarter:
315 case fraction_eighth:
318 case fraction_sixteenth:
324 case fraction_hundredth:
327 case fraction_one_digit:
331 case fraction_two_digits:
335 case fraction_three_digits:
340 kdDebug(36001) << "Error in Fraction format\n";
341 return TQString::number(value);
348 if (fmtType != fraction_three_digits
349 && fmtType != fraction_two_digits
350 && fmtType != fraction_one_digit) {
353 double diff = result;
354 for ( int i = 1; i <= index; i++) {
355 calc = i * 1.0 / index;
356 if (fabs(result - calc) < diff) {
358 diff = fabs(result - calc);
361 if( index1 == 0 ) return TQString( "%1").arg( floor(value) );
362 if( index1 == index ) return TQString( "%1").arg( floor(value)+1 );
363 if( floor(value) == 0)
364 return TQString( "%1/%2").arg( index1 ).arg( index );
366 return TQString( "%1 %2/%3")
376 double precision, denominator, numerator;
379 double val1 = result;
380 double val2 = rint(result);
385 precision = pow(10.0, -index);
389 while (fabs(numerator/denominator - result) > precision) {
390 val1 = (1 / (val1 - val2));
392 p = val2 * numerator + inter2;
393 q = val2 * denominator + inter4;
395 inter4 = denominator;
400 } while (fabs(denominator) > limit);
402 denominator = fabs(denominator);
403 numerator = fabs(numerator);
405 if (denominator == numerator)
406 return TQString().setNum(floor(value + 1));
409 if ( floor(value) == 0 )
410 return TQString( "%1/%2").arg(numerator).arg(denominator);
412 return TQString( "%1 %2/%3")
421 if (fmtType == Time_format)
422 return converter->locale()->formatTime(dt.time(), false);
424 if (fmtType == SecondeTime_format)
425 return converter->locale()->formatTime(dt.time(), true);
427 int h = dt.time().hour();
428 int m = dt.time().minute();
429 int s = dt.time().second();
431 TQString hour = ( h < 10 ? "0" + TQString::number(h) : TQString::number(h) );
432 TQString minute = ( m < 10 ? "0" + TQString::number(m) : TQString::number(m) );
433 TQString second = ( s < 10 ? "0" + TQString::number(s) : TQString::number(s) );
435 TQString AMPM( pm ? i18n( "PM"):i18n( "AM") );
437 if (fmtType == Time_format1) {
438 return TQString( "%1:%2 %3")
439 .arg((pm ? h - 12 : h),2)
444 if (fmtType == Time_format2) {
445 return TQString( "%1:%2:%3 %4")
446 .arg((pm ? h-12 : h),2)
452 if (fmtType == Time_format3) {
453 return TQString( "%1 %2 %3 %4 %5 %6")
462 if (fmtType == Time_format4) {
463 return TQString( "%1:%2").arg(hour, 2).arg(minute, 2);
466 if (fmtType == Time_format5) {
467 return TQString( "%1:%2:%3").arg(hour, 2).arg(minute, 2).arg(second, 2);
470 TQDate d1(dt.date());
471 TQDate d2( 1899, 12, 31 );
472 int d = d2.daysTo( d1 ) + 1;
476 if (fmtType == Time_format6)
479 return TQString( "%1:%2").arg(m, 1).arg(second, 2);
481 if (fmtType == Time_format7) {
482 return TQString( "%1:%2:%3").arg(h, 1).arg(minute, 2).arg(second, 2);
484 if (fmtType == Time_format8)
487 return TQString( "%1:%2").arg(h, 1).arg(minute, 2);
490 return converter->locale()->formatTime( dt.time(), false );
496 if (fmtType == ShortDate_format) {
497 tmp = converter->locale()->formatDate(date, true);
499 else if (fmtType == TextDate_format) {
500 tmp = converter->locale()->formatDate(date, false);
502 else if (fmtType == date_format1) {
503 tmp = TQString().sprintf( "%02d", date.day());
504 tmp += "-" + converter->locale()->calendar()->monthString(date, true) + "-";
505 tmp += TQString::number(date.year()).right(2);
507 else if (fmtType == date_format2) {
508 tmp = TQString().sprintf( "%02d", date.day());
509 tmp += "-" + converter->locale()->calendar()->monthString(date, true) + "-";
510 tmp += TQString::number(date.year());
512 else if (fmtType == date_format3) {
513 tmp = TQString().sprintf( "%02d", date.day());
514 tmp += "-" + converter->locale()->calendar()->monthString(date, true);
516 else if (fmtType == date_format4) {
517 tmp = TQString().sprintf( "%02d", date.day());
518 tmp += "-" + TQString().sprintf( "%02d", date.month() );
520 else if (fmtType == date_format5) {
521 tmp = TQString().sprintf( "%02d", date.day());
522 tmp += "/" + TQString().sprintf( "%02d", date.month()) + "/";
523 tmp += TQString::number(date.year()).right(2);
525 else if (fmtType == date_format6) {
526 tmp = TQString().sprintf( "%02d", date.day());
527 tmp += "/" + TQString().sprintf( "%02d", date.month()) + "/";
528 tmp += TQString::number(date.year());
530 else if (fmtType == date_format7) {
531 tmp = converter->locale()->calendar()->monthString(date, true) + "-";
532 tmp += TQString::number(date.year()).right(2);
534 else if (fmtType == date_format8) {
535 tmp = converter->locale()->calendar()->monthString(date, false) + "-";
536 tmp += TQString::number(date.year()).right(2);
538 else if (fmtType == date_format9) {
539 tmp = converter->locale()->calendar()->monthString(date, false) + "-";
540 tmp += TQString::number(date.year());
542 else if (fmtType == date_format10) {
543 tmp = converter->locale()->calendar()->monthString(date, false).at(0) + "-";
544 tmp += TQString::number(date.year()).right(2);
546 else if (fmtType == date_format11) {
547 tmp = TQString().sprintf( "%02d", date.day()) + "/";
548 tmp += converter->locale()->calendar()->monthString(date, true);
550 else if (fmtType == date_format12) {
551 tmp = TQString().sprintf( "%02d", date.day()) + "/";
552 tmp += TQString().sprintf( "%02d", date.month());
554 else if (fmtType == date_format13) {
555 tmp = TQString().sprintf( "%02d", date.day());
556 tmp += "/" + converter->locale()->calendar()->monthString(date, true) + "/";
557 tmp += TQString::number(date.year());
559 else if (fmtType == date_format14) {
560 tmp = TQString::number(date.year());
561 tmp += "/" + converter->locale()->calendar()->monthString(date, true) + "/";
562 tmp += TQString().sprintf( "%02d", date.day());
564 else if (fmtType == date_format15) {
565 tmp = TQString::number(date.year());
566 tmp += "-" + converter->locale()->calendar()->monthString(date, true) + "-";
567 tmp += TQString().sprintf( "%02d", date.day());
569 else if (fmtType == date_format16) {
570 tmp = TQString::number(date.year());
571 tmp += "-" + TQString().sprintf( "%02d", date.month()) + "-";
572 tmp += TQString().sprintf( "%02d", date.day());
574 else if (fmtType == date_format17) {
575 tmp = TQString().sprintf( "%d", date.day());
576 tmp += " " + converter->locale()->calendar()->monthString(date, false) + " ";
577 tmp += TQString::number(date.year());
579 else if (fmtType == date_format18) {
580 tmp = TQString().sprintf( "%02d", date.month());
581 tmp += "/" + TQString().sprintf( "%02d", date.day());
582 tmp += "/" + TQString::number(date.year());
584 else if (fmtType == date_format19) {
585 tmp = TQString().sprintf( "%02d", date.month());
586 tmp += "/" + TQString().sprintf( "%02d", date.day());
587 tmp += "/" + TQString::number(date.year()).right(2);
589 else if (fmtType == date_format20) {
590 tmp = converter->locale()->calendar()->monthString(date, true);
591 tmp += "/" + TQString().sprintf( "%02d", date.day());
592 tmp += "/" + TQString::number(date.year()).right(2);
594 else if (fmtType == date_format21) {
595 tmp = converter->locale()->calendar()->monthString(date, true);
596 tmp += "/" + TQString().sprintf( "%02d", date.day());
597 tmp += "/" + TQString::number(date.year());
599 else if (fmtType == date_format22) {
600 tmp = converter->locale()->calendar()->monthString(date, true) + "-";
601 tmp += TQString::number(date.year());
603 else if (fmtType == date_format23) {
604 tmp = TQString::number(date.year());
606 else if (fmtType == date_format24) {
607 tmp = TQString::number(date.year()).right(2);
609 else if (fmtType == date_format25) {
610 tmp = TQString::number(date.year());
611 tmp += "/" + TQString().sprintf( "%02d", date.month());
612 tmp += "/" + TQString().sprintf( "%02d", date.day());
614 else if (fmtType == date_format26) {
615 tmp = TQString::number(date.year());
616 tmp += "/" + converter->locale()->calendar()->monthString(date, true);
617 tmp += "/" + TQString().sprintf( "%02d", date.day());
620 tmp = converter->locale()->formatDate(date, true);
633TQString ValueFormatter::errorFormat ( Cell *cell)
636 if (cell->testFlag (Cell::Flag_ParseError))
637 err = "#" + i18n ( "Parse") + "!";
638 else if ( cell->testFlag (Cell::Flag_CircularCalculation))
639 err = "#" + i18n ( "Circle") + "!";
640 else if ( cell->testFlag (Cell::Flag_DependancyError))
641 err = "#" + i18n ( "Depend") + "!";
645 kdDebug(36001) << "Unhandled error type." << endl;
For every cell in the spread sheet there is a Cell object.
The ValueConverter class can convert Value between various different formats.
Provides a wrapper for cell value.
Value element(unsigned column, unsigned row) const Return an element in the array value.
Format format() const Returns the format of the value (i.e.
bool isBoolean() const Returns true if the type of this value is Boolean.
bool isArray() const Returns true if the type of this value is array.
TQDate asDate() const Returns the date representation of this value.
double asFloat() const Returns the floating-point value of this value.
TQDateTime asDateTime() const Returns the date/time representation of this value.
bool isString() const Returns true if the type of this value is string.
|