kspread

valueconverter.cpp
1/* This file is part of the KDE project
2 Copyright 2004 Tomas Mecir <mecirt@gmail.com>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20#include "valueconverter.h"
21
22#include "kspread_locale.h"
23#include "valueparser.h"
24
25using namespace KSpread;
26
30
31TDELocale* ValueConverter::locale()
32{
33 return parser->locale();
34}
35
36Value ValueConverter::asBoolean (const Value &value) const
37{
38 Value val;
39 bool ok;
40 switch (value.type()) {
41 case Value::Empty:
42 val.setValue (false);
43 break;
44 case Value::Boolean:
45 val = value;
46 break;
47 case Value::Integer:
48 val.setValue (value.asInteger() ? true : false);
49 break;
50 case Value::Float:
51 val.setValue ((value.asFloat() == 0.0) ? false : true);
52 break;
53 case Value::String:
54 val = parser->tryParseBool (value.asString(), &ok);
55 if (!ok)
56 val.setValue (false);
57 break;
58 case Value::Array:
59 val = asBoolean (value.element (0, 0));
60 break;
61 case Value::CellRange:
62 /* NOTHING */
63 break;
64 case Value::Error:
65 val.setValue (false);
66 break;
67 };
68
69 return val;
70}
71
72Value ValueConverter::asInteger (const Value &value) const
73{
74 Value val;
75 bool ok;
76
77 switch (value.type()) {
78 case Value::Empty:
79 val.setValue (0);
80 break;
81 case Value::Boolean:
82 val.setValue (value.asBoolean() ? 1 : 0);
83 break;
84 case Value::Integer:
85 val = value;
86 break;
87 case Value::Float:
88 val.setValue (value.asInteger());
89 break;
90 case Value::String:
91 val.setValue ((int) parser->tryParseNumber
92 (value.asString(), &ok).asFloat());
93 if (!ok)
94 val.setValue (0);
95 break;
96 case Value::Array:
97 val = asInteger (value.element (0, 0));
98 break;
99 case Value::CellRange:
100 /* NOTHING */
101 break;
102 case Value::Error:
103 val.setValue (0);
104 break;
105 };
106
107 return val;
108}
109
110Value ValueConverter::asFloat (const Value &value) const
111{
112 Value val;
113 bool ok;
114
115 switch (value.type()) {
116 case Value::Empty:
117 val.setValue (0.0);
118 break;
119 case Value::Boolean:
120 val.setValue (value.asBoolean() ? 1.0 : 0.0);
121 break;
122 case Value::Integer:
123 val.setValue (value.asFloat ());
124 break;
125 case Value::Float:
126 val = value;
127 break;
128 case Value::String:
129 val = parser->tryParseNumber (value.asString(), &ok);
130 if (!ok)
131 val.setValue (0.0);
132 break;
133 case Value::Array:
134 val = asFloat (value.element (0, 0));
135 break;
136 case Value::CellRange:
137 /* NOTHING */
138 break;
139 case Value::Error:
140 val.setValue (0.0);
141 break;
142 };
143
144 return val;
145}
146
148{
149 // as of now, we simply go to float; later on, further datatypes
150 // may be possible as a result of this
151 return asFloat (value);
152}
153
154Value ValueConverter::asString (const Value &value) const
155{
156 // This is a simpler version of ValueFormatter... We cannot use that one,
157 // as we sometimes want to generate the string differently ...
158
159 Value val;
160 TQString s;
161 Value::Format fmt;
162 TQChar decimal_point;
163 int pos;
164 switch (value.type()) {
165 case Value::Empty:
166 val = TQString();
167 break;
168 case Value::Boolean:
169 val.setValue (value.asBoolean() ? parser->locale()->translate ("True") :
170 parser->locale()->translate ("False"));
171 break;
172 case Value::Integer:
173 {
174 fmt = value.format();
175 if (fmt == Value::fmt_Percent)
176 val = TQString::number (value.asInteger() * 100) + " %";
177 else if (fmt == Value::fmt_DateTime)
178 val = parser->locale()->formatDateTime (value.asDateTime());
179 else if (fmt == Value::fmt_Date)
180 val = parser->locale()->formatDate (value.asDate());
181 else if (fmt == Value::fmt_Time)
182 val = parser->locale()->formatTime (value.asTime());
183 else
184 val = TQString::number (value.asInteger());
185 }
186 break;
187 case Value::Float:
188 fmt = value.format();
189 if (fmt == Value::fmt_DateTime)
190 val = parser->locale()->formatDateTime (value.asDateTime());
191 else if (fmt == Value::fmt_Date)
192 val = parser->locale()->formatDate (value.asDate(), true);
193 else if (fmt == Value::fmt_Time)
194 val = parser->locale()->formatTime (value.asTime());
195 else
196 {
197 //convert the number, change decimal point from English to local
198 s = TQString::number (value.asFloat(), 'g', 10);
199 decimal_point = parser->locale()->decimalSymbol()[0];
200 if (decimal_point && ((pos = s.find ('.')) != -1))
201 s = s.replace (pos, 1, decimal_point);
202 if (fmt == Value::fmt_Percent)
203 s += " %";
204 val.setValue (s);
205 }
206 break;
207 case Value::String:
208 val = value;
209 break;
210 case Value::Array:
211 val = asString (value.element (0, 0));
212 break;
213 case Value::CellRange:
214 /* NOTHING */
215 break;
216 case Value::Error:
217 val.setValue (value.errorMessage ());
218 break;
219 };
220
221 return val;
222}
223
224Value ValueConverter::asDateTime (const Value &value) const
225{
226 Value val;
227 bool ok;
228
229 switch (value.type()) {
230 case Value::Empty:
231 val.setValue (TQDateTime::currentDateTime());
232 break;
233 case Value::Boolean:
234 //ignore the bool value... any better idea? ;)
235 val.setValue (TQDateTime::currentDateTime());
236 break;
237 case Value::Integer:
238 val.setValue (value.asFloat());
239 val.setFormat (Value::fmt_DateTime);
240 break;
241 case Value::Float:
242 val.setValue (value.asFloat());
243 val.setFormat (Value::fmt_DateTime);
244 break;
245 case Value::String:
246 //no DateTime parser, so we parse as Date, hoping for the best ...
247 val = parser->tryParseDate (value.asString(), &ok);
248 if (!ok)
249 val = Value::errorVALUE();
250 val.setFormat (Value::fmt_DateTime);
251 break;
252 case Value::Array:
253 val = asDateTime (value.element (0, 0));
254 break;
255 case Value::CellRange:
256 /* NOTHING */
257 break;
258 case Value::Error:
259 break;
260 };
261
262 return val;
263}
264
265Value ValueConverter::asDate (const Value &value) const
266{
267 Value val;
268 bool ok;
269
270 switch (value.type()) {
271 case Value::Empty:
272 val.setValue (TQDate::currentDate());
273 break;
274 case Value::Boolean:
275 //ignore the bool value... any better idea? ;)
276 val.setValue (TQDate::currentDate());
277 break;
278 case Value::Integer:
279 val.setValue (value.asFloat());
280 val.setFormat (Value::fmt_Date);
281 break;
282 case Value::Float:
283 val.setValue (value.asFloat());
284 val.setFormat (Value::fmt_Date);
285 break;
286 case Value::String:
287 val = parser->tryParseDate (value.asString(), &ok);
288 if (!ok)
289 val = Value::errorVALUE();
290 break;
291 case Value::Array:
292 val = asDate (value.element (0, 0));
293 break;
294 case Value::CellRange:
295 /* NOTHING */
296 break;
297 case Value::Error:
298 break;
299 };
300
301 return val;
302}
303
304Value ValueConverter::asTime (const Value &value) const
305{
306 Value val;
307 bool ok;
308
309 switch (value.type()) {
310 case Value::Empty:
311 val.setValue (TQTime::currentTime());
312 break;
313 case Value::Boolean:
314 //ignore the bool value... any better idea? ;)
315 val.setValue (TQTime::currentTime());
316 break;
317 case Value::Integer:
318 val.setValue (value.asInteger());
319 val.setFormat (Value::fmt_Time);
320 break;
321 case Value::Float:
322 val.setValue (value.asFloat());
323 val.setFormat (Value::fmt_Time);
324 break;
325 case Value::String:
326 val = parser->tryParseTime (value.asString(), &ok);
327 if (!ok)
328 val = Value::errorVALUE();
329 break;
330 case Value::Array:
331 val = asTime (value.element (0, 0));
332 break;
333 case Value::CellRange:
334 /* NOTHING */
335 break;
336 case Value::Error:
337 break;
338 };
339
340 return val;
341}
342
Value asNumeric(const Value &value) const
convert to a numeric value - not necessarily float
ValueConverter(ValueParser *parser)
constructor
The ValueParser parses a text input from the user, generating Value in the desired format.
Definition valueparser.h:40
Provides a wrapper for cell value.
Value element(unsigned column, unsigned row) const
Return an element in the array value.
void setFormat(Format fmt)
Sets format information for this value.
Format format() const
Returns the format of the value (i.e.
void setValue(const Value &v)
Sets this value to another value.
TQDate asDate() const
Returns the date representation of this value.
Type type() const
Returns the type of the value.
double asFloat() const
Returns the floating-point value of this value.
long asInteger() const
Returns the integer value of this value.
TQString errorMessage() const
Returns error message associated with this value.
TQDateTime asDateTime() const
Returns the date/time representation of this value.
TQString asString() const
Returns the string value of this value.
static const Value & errorVALUE()
Returns constant reference to VALUE!
TQTime asTime() const
Returns the time representation of this value.
bool asBoolean() const
Returns the boolean value of this value.
The KSpread namespace.
Definition commands.h:39