// -*- c++ -*- /* * Jakelib2 - General purpose C++ library * Copyright (C) 2001 Florian Wolff (florian@donuz.de) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: NumberFormat.jlc,v 1.14 2003/09/27 08:10:28 florian Exp $ */ #include "jakelib2.h" #include "jakelib2/text/NumberFormat.h" #include "jakelib2/text/DecimalFormat.h" using namespace jakelib::lang; using namespace jakelib::text; using namespace jakelib::util; JAKELIB_IMPLEMENT_CLASS("jakelib.text.NumberFormat", NumberFormat, Format); jint NumberFormat::INTEGER_FIELD = 0; jint NumberFormat::FRACTION_FIELD = 1; /*****************************************************************************\ * NumberFormat | *****************************************************************************/ NumberFormat::NumberFormat() { } /*****************************************************************************\ * format | *****************************************************************************/ String *NumberFormat::format(jlong number) { StringBuffer sbuf; format(number, &sbuf, null); return sbuf.toString(); } StringBuffer *NumberFormat::format(Object *obj, StringBuffer *sbuf, FieldPosition *pos) { if (obj->instanceOf(`"jakelib.lang.Number"`)) { return format(((Number *) obj)->doubleValue(), sbuf, pos); } else { throw new IllegalArgumentException(`"Cannot format given Object as a Number"` .. JAKELIB_AT2("jakelib.text.NumberFormat.format")); } } String *NumberFormat::format(jdouble number) { StringBuffer *sbuf = new StringBuffer(50); format(number, sbuf, null); return sbuf->toString(); } /*****************************************************************************\ * equals | *****************************************************************************/ jboolean NumberFormat::equals(Object * obj) { if (!(obj->instanceOf(`"jakelib.text.NumberFormat"`))) return false; NumberFormat *nf = (NumberFormat *) obj; return (groupingUsed == nf->groupingUsed && maximumFractionDigits == nf->maximumFractionDigits && maximumIntegerDigits == nf->maximumIntegerDigits && minimumFractionDigits == nf->minimumFractionDigits && minimumIntegerDigits == nf->minimumIntegerDigits && parseIntegerOnly == nf->parseIntegerOnly); } /*****************************************************************************\ * getAvailableLocales | *****************************************************************************/ Locales *NumberFormat::getAvailableLocales() { Locales *list = new Locales((jint) 1); list->set(0, Locale::US); return list; } /*****************************************************************************\ * computeInstance | *****************************************************************************/ NumberFormat *NumberFormat::computeInstance(Locale * loc, String * resource, String * def) { DecimalFormatSyms *dfs = new DecimalFormatSyms(loc); return new DecimalFormat(def, dfs); } /*****************************************************************************\ * getCurrencyInstance | *****************************************************************************/ NumberFormat *NumberFormat::getCurrencyInstance() { return getCurrencyInstance(jakelib::util::Locale::getDefault()); } NumberFormat *NumberFormat::getCurrencyInstance(jakelib::util::Locale * loc) { return computeInstance(loc, `"currencyFormat"`, `"$#,##0.00;($#,##0.00)"`); } /*****************************************************************************\ * getInstance | *****************************************************************************/ NumberFormat *NumberFormat::getInstance() { return getInstance(jakelib::util::Locale::getDefault()); } NumberFormat *NumberFormat::getInstance(jakelib::util::Locale * loc) { // For now always return a number instance. return getNumberInstance(loc); } /*****************************************************************************\ * getMaximumFractionDigits | *****************************************************************************/ jint NumberFormat::getMaximumFractionDigits() { return maximumFractionDigits; } /*****************************************************************************\ * getMaximumIntegerDigits | *****************************************************************************/ jint NumberFormat::getMaximumIntegerDigits() { return maximumIntegerDigits; } /*****************************************************************************\ * getMaximumFractionDigits | *****************************************************************************/ jint NumberFormat::getMinimumFractionDigits() { return minimumFractionDigits; } /*****************************************************************************\ * getMinimumIntegerDigits | *****************************************************************************/ jint NumberFormat::getMinimumIntegerDigits() { return minimumIntegerDigits; } /*****************************************************************************\ * getNumberInstance | *****************************************************************************/ NumberFormat *NumberFormat::getNumberInstance() { return getNumberInstance(jakelib::util::Locale::getDefault()); } NumberFormat *NumberFormat::getNumberInstance(jakelib::util::Locale * loc) { return computeInstance(loc, `"numberFormat"`, `"#,##0.###"`); } /*****************************************************************************\ * getPercentInstance | *****************************************************************************/ NumberFormat *NumberFormat::getPercentInstance() { return getPercentInstance(jakelib::util::Locale::getDefault()); } NumberFormat *NumberFormat::getPercentInstance(jakelib::util::Locale * loc) { return computeInstance(loc, `"percentFormat"`, `"#,##0%"`); } /*****************************************************************************\ * hashCode | *****************************************************************************/ jint NumberFormat::hashCode() { jint hash = 0; hash ^= (maximumFractionDigits + maximumIntegerDigits + minimumFractionDigits + minimumIntegerDigits); if (groupingUsed) { hash ^= 0xf0f0; } if (parseIntegerOnly) { hash ^= 0x0f0f; } return hash; } /*****************************************************************************\ * isGroupingUsed | *****************************************************************************/ jboolean NumberFormat::isGroupingUsed() { return groupingUsed; } /*****************************************************************************\ * isParseIntegerOnly | *****************************************************************************/ jboolean NumberFormat::isParseIntegerOnly() { return parseIntegerOnly; } /*****************************************************************************\ * parse | *****************************************************************************/ Number *NumberFormat::parse(String * sourceStr) { ParsePosition *pp = new ParsePosition(0); Number *r = parse(sourceStr, pp); if (r == null) { jint index = pp->getErrorIndex(); if (index < 0) index = pp->getIndex(); throw new ParseException(`"couldn't parse number"` .. JAKELIB_AT2("jakelib.text.NumberFormat.parse"), index); } return r; } /*****************************************************************************\ * parseObject | *****************************************************************************/ Object *NumberFormat::parseObject(String * sourceStr, ParsePosition * pos) { return parse(sourceStr, pos); } /*****************************************************************************\ * setGroupingUsed | *****************************************************************************/ void NumberFormat::setGroupingUsed(jboolean newValue) { groupingUsed = newValue; } /*****************************************************************************\ * setMaximumFractionDigits | *****************************************************************************/ void NumberFormat::setMaximumFractionDigits(jint newValue) { maximumFractionDigits = newValue; if (getMinimumFractionDigits() > maximumFractionDigits) setMinimumFractionDigits(maximumFractionDigits); } /*****************************************************************************\ * setMaximumIntegerDigits | *****************************************************************************/ void NumberFormat::setMaximumIntegerDigits(jint newValue) { maximumIntegerDigits = newValue; if (getMinimumIntegerDigits() > maximumIntegerDigits) setMinimumIntegerDigits(maximumIntegerDigits); } /*****************************************************************************\ * setMinimumFractionDigits | *****************************************************************************/ void NumberFormat::setMinimumFractionDigits(jint newValue) { minimumFractionDigits = newValue; if (getMaximumFractionDigits() < minimumFractionDigits) setMaximumFractionDigits(minimumFractionDigits); } /*****************************************************************************\ * setMinimumIntegerDigits | *****************************************************************************/ void NumberFormat::setMinimumIntegerDigits(jint newValue) { minimumIntegerDigits = newValue; if (getMaximumIntegerDigits() < minimumIntegerDigits) setMaximumIntegerDigits(minimumIntegerDigits); } /*****************************************************************************\ * setParseIntegerOnly | *****************************************************************************/ void NumberFormat::setParseIntegerOnly(jboolean value) { parseIntegerOnly = value; }