All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.joda.money.format.SignedPrinterParser Maven / Gradle / Ivy

There is a newer version: 0.10.0
Show newest version
/*
 *  Copyright 2009-present, Stephen Colebourne
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.joda.money.format;

import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;

import org.joda.money.BigMoney;

/**
 * Prints and parses using delegated formatters, one for positive and one for megative.
 * 

* This class is immutable and thread-safe. */ final class SignedPrinterParser implements MoneyPrinter, MoneyParser, Serializable { /** Serialization version. */ private static final long serialVersionUID = 1L; /** The formatter to use when positive. */ private final MoneyFormatter whenPositive; /** The formatter to use when zero. */ private final MoneyFormatter whenZero; /** The formatter to use when negative. */ private final MoneyFormatter whenNegative; /** * Constructor. * @param whenPositive the formatter to use when the amount is positive * @param whenZero the formatter to use when the amount is zero * @param whenNegative the formatter to use when the amount is positive */ SignedPrinterParser(MoneyFormatter whenPositive, MoneyFormatter whenZero, MoneyFormatter whenNegative) { this.whenPositive = whenPositive; this.whenZero = whenZero; this.whenNegative = whenNegative; } //----------------------------------------------------------------------- @Override public void print(MoneyPrintContext context, Appendable appendable, BigMoney money) throws IOException { MoneyFormatter fmt = (money.isZero() ? whenZero : money.isPositive() ? whenPositive : whenNegative); fmt.getPrinterParser().print(context, appendable, money); } @Override public void parse(MoneyParseContext context) { MoneyParseContext positiveContext = context.createChild(); whenPositive.getPrinterParser().parse(positiveContext); MoneyParseContext zeroContext = context.createChild(); whenZero.getPrinterParser().parse(zeroContext); MoneyParseContext negativeContext = context.createChild(); whenNegative.getPrinterParser().parse(negativeContext); MoneyParseContext best = null; if (!positiveContext.isError()) { best = positiveContext; } if (!zeroContext.isError()) { if (best == null || zeroContext.getIndex() > best.getIndex()) { best = zeroContext; } } if (!negativeContext.isError()) { if (best == null || negativeContext.getIndex() > best.getIndex()) { best = negativeContext; } } if (best == null) { context.setError(); } else { context.mergeChild(best); if (best == zeroContext) { if (context.getAmount() == null || context.getAmount().compareTo(BigDecimal.ZERO) != 0) { context.setAmount(BigDecimal.ZERO); } } else if (best == negativeContext && context.getAmount().compareTo(BigDecimal.ZERO) > 0) { context.setAmount(context.getAmount().negate()); } } } @Override public String toString() { return "PositiveZeroNegative(" + whenPositive + "," + whenZero + "," + whenNegative + ")"; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy