summaryrefslogtreecommitdiffstats
path: root/kspread/valueconverter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kspread/valueconverter.cpp')
-rw-r--r--kspread/valueconverter.cpp342
1 files changed, 342 insertions, 0 deletions
diff --git a/kspread/valueconverter.cpp b/kspread/valueconverter.cpp
new file mode 100644
index 000000000..21cb75310
--- /dev/null
+++ b/kspread/valueconverter.cpp
@@ -0,0 +1,342 @@
+/* This file is part of the KDE project
+ Copyright 2004 Tomas Mecir <mecirt@gmail.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include "valueconverter.h"
+
+#include "kspread_locale.h"
+#include "valueparser.h"
+
+using namespace KSpread;
+
+ValueConverter::ValueConverter (ValueParser* p) : parser( p )
+{
+}
+
+TDELocale* ValueConverter::locale()
+{
+ return parser->locale();
+}
+
+Value ValueConverter::asBoolean (const Value &value) const
+{
+ Value val;
+ bool ok;
+ switch (value.type()) {
+ case Value::Empty:
+ val.setValue (false);
+ break;
+ case Value::Boolean:
+ val = value;
+ break;
+ case Value::Integer:
+ val.setValue (value.asInteger() ? true : false);
+ break;
+ case Value::Float:
+ val.setValue ((value.asFloat() == 0.0) ? false : true);
+ break;
+ case Value::String:
+ val = parser->tryParseBool (value.asString(), &ok);
+ if (!ok)
+ val.setValue (false);
+ break;
+ case Value::Array:
+ val = asBoolean (value.element (0, 0));
+ break;
+ case Value::CellRange:
+ /* NOTHING */
+ break;
+ case Value::Error:
+ val.setValue (false);
+ break;
+ };
+
+ return val;
+}
+
+Value ValueConverter::asInteger (const Value &value) const
+{
+ Value val;
+ bool ok;
+
+ switch (value.type()) {
+ case Value::Empty:
+ val.setValue (0);
+ break;
+ case Value::Boolean:
+ val.setValue (value.asBoolean() ? 1 : 0);
+ break;
+ case Value::Integer:
+ val = value;
+ break;
+ case Value::Float:
+ val.setValue (value.asInteger());
+ break;
+ case Value::String:
+ val.setValue ((int) parser->tryParseNumber
+ (value.asString(), &ok).asFloat());
+ if (!ok)
+ val.setValue (0);
+ break;
+ case Value::Array:
+ val = asInteger (value.element (0, 0));
+ break;
+ case Value::CellRange:
+ /* NOTHING */
+ break;
+ case Value::Error:
+ val.setValue (0);
+ break;
+ };
+
+ return val;
+}
+
+Value ValueConverter::asFloat (const Value &value) const
+{
+ Value val;
+ bool ok;
+
+ switch (value.type()) {
+ case Value::Empty:
+ val.setValue (0.0);
+ break;
+ case Value::Boolean:
+ val.setValue (value.asBoolean() ? 1.0 : 0.0);
+ break;
+ case Value::Integer:
+ val.setValue (value.asFloat ());
+ break;
+ case Value::Float:
+ val = value;
+ break;
+ case Value::String:
+ val = parser->tryParseNumber (value.asString(), &ok);
+ if (!ok)
+ val.setValue (0.0);
+ break;
+ case Value::Array:
+ val = asFloat (value.element (0, 0));
+ break;
+ case Value::CellRange:
+ /* NOTHING */
+ break;
+ case Value::Error:
+ val.setValue (0.0);
+ break;
+ };
+
+ return val;
+}
+
+Value ValueConverter::asNumeric (const Value &value) const
+{
+ // as of now, we simply go to float; later on, further datatypes
+ // may be possible as a result of this
+ return asFloat (value);
+}
+
+Value ValueConverter::asString (const Value &value) const
+{
+ // This is a simpler version of ValueFormatter... We cannot use that one,
+ // as we sometimes want to generate the string differently ...
+
+ Value val;
+ TQString s;
+ Value::Format fmt;
+ TQChar decimal_point;
+ int pos;
+ switch (value.type()) {
+ case Value::Empty:
+ val = TQString();
+ break;
+ case Value::Boolean:
+ val.setValue (value.asBoolean() ? parser->locale()->translate ("True") :
+ parser->locale()->translate ("False"));
+ break;
+ case Value::Integer:
+ {
+ fmt = value.format();
+ if (fmt == Value::fmt_Percent)
+ val = TQString::number (value.asInteger() * 100) + " %";
+ else if (fmt == Value::fmt_DateTime)
+ val = parser->locale()->formatDateTime (value.asDateTime());
+ else if (fmt == Value::fmt_Date)
+ val = parser->locale()->formatDate (value.asDate());
+ else if (fmt == Value::fmt_Time)
+ val = parser->locale()->formatTime (value.asTime());
+ else
+ val = TQString::number (value.asInteger());
+ }
+ break;
+ case Value::Float:
+ fmt = value.format();
+ if (fmt == Value::fmt_DateTime)
+ val = parser->locale()->formatDateTime (value.asDateTime());
+ else if (fmt == Value::fmt_Date)
+ val = parser->locale()->formatDate (value.asDate(), true);
+ else if (fmt == Value::fmt_Time)
+ val = parser->locale()->formatTime (value.asTime());
+ else
+ {
+ //convert the number, change decimal point from English to local
+ s = TQString::number (value.asFloat(), 'g', 10);
+ decimal_point = parser->locale()->decimalSymbol()[0];
+ if (decimal_point && ((pos = s.find ('.')) != -1))
+ s = s.replace (pos, 1, decimal_point);
+ if (fmt == Value::fmt_Percent)
+ s += " %";
+ val.setValue (s);
+ }
+ break;
+ case Value::String:
+ val = value;
+ break;
+ case Value::Array:
+ val = asString (value.element (0, 0));
+ break;
+ case Value::CellRange:
+ /* NOTHING */
+ break;
+ case Value::Error:
+ val.setValue (value.errorMessage ());
+ break;
+ };
+
+ return val;
+}
+
+Value ValueConverter::asDateTime (const Value &value) const
+{
+ Value val;
+ bool ok;
+
+ switch (value.type()) {
+ case Value::Empty:
+ val.setValue (TQDateTime::currentDateTime());
+ break;
+ case Value::Boolean:
+ //ignore the bool value... any better idea? ;)
+ val.setValue (TQDateTime::currentDateTime());
+ break;
+ case Value::Integer:
+ val.setValue (value.asFloat());
+ val.setFormat (Value::fmt_DateTime);
+ break;
+ case Value::Float:
+ val.setValue (value.asFloat());
+ val.setFormat (Value::fmt_DateTime);
+ break;
+ case Value::String:
+ //no DateTime parser, so we parse as Date, hoping for the best ...
+ val = parser->tryParseDate (value.asString(), &ok);
+ if (!ok)
+ val = Value::errorVALUE();
+ val.setFormat (Value::fmt_DateTime);
+ break;
+ case Value::Array:
+ val = asDateTime (value.element (0, 0));
+ break;
+ case Value::CellRange:
+ /* NOTHING */
+ break;
+ case Value::Error:
+ break;
+ };
+
+ return val;
+}
+
+Value ValueConverter::asDate (const Value &value) const
+{
+ Value val;
+ bool ok;
+
+ switch (value.type()) {
+ case Value::Empty:
+ val.setValue (TQDate::currentDate());
+ break;
+ case Value::Boolean:
+ //ignore the bool value... any better idea? ;)
+ val.setValue (TQDate::currentDate());
+ break;
+ case Value::Integer:
+ val.setValue (value.asFloat());
+ val.setFormat (Value::fmt_Date);
+ break;
+ case Value::Float:
+ val.setValue (value.asFloat());
+ val.setFormat (Value::fmt_Date);
+ break;
+ case Value::String:
+ val = parser->tryParseDate (value.asString(), &ok);
+ if (!ok)
+ val = Value::errorVALUE();
+ break;
+ case Value::Array:
+ val = asDate (value.element (0, 0));
+ break;
+ case Value::CellRange:
+ /* NOTHING */
+ break;
+ case Value::Error:
+ break;
+ };
+
+ return val;
+}
+
+Value ValueConverter::asTime (const Value &value) const
+{
+ Value val;
+ bool ok;
+
+ switch (value.type()) {
+ case Value::Empty:
+ val.setValue (TQTime::currentTime());
+ break;
+ case Value::Boolean:
+ //ignore the bool value... any better idea? ;)
+ val.setValue (TQTime::currentTime());
+ break;
+ case Value::Integer:
+ val.setValue (value.asInteger());
+ val.setFormat (Value::fmt_Time);
+ break;
+ case Value::Float:
+ val.setValue (value.asFloat());
+ val.setFormat (Value::fmt_Time);
+ break;
+ case Value::String:
+ val = parser->tryParseTime (value.asString(), &ok);
+ if (!ok)
+ val = Value::errorVALUE();
+ break;
+ case Value::Array:
+ val = asTime (value.element (0, 0));
+ break;
+ case Value::CellRange:
+ /* NOTHING */
+ break;
+ case Value::Error:
+ break;
+ };
+
+ return val;
+}
+