/** * Access a {@link javax.money.MonetaryRounding} for rounding {@link javax.money.MonetaryAmount} * instances given a currency. * * @param currencyUnit The currency, which determines the required precision. As * {@link java.math.RoundingMode}, by default, {@link java.math.RoundingMode#HALF_UP} * is sued. * @param providers the optional provider list and ordering to be used * @return a new instance {@link javax.money.MonetaryOperator} implementing the * rounding, never {@code null}. * @throws MonetaryException if no such rounding could be provided. */ default MonetaryRounding getRounding(CurrencyUnit currencyUnit, String... providers) { MonetaryRounding op = getRounding(RoundingQueryBuilder.of().setProviderNames(providers).setCurrency(currencyUnit).build()); return Optional.ofNullable(op).orElseThrow(() -> new MonetaryException( "No rounding provided for CurrencyUnit: " + currencyUnit.getCurrencyCode())); }
/** * Checks if a {@link MonetaryRounding} is available given a {@link javax.money.CurrencyUnit}. * * @param currencyUnit The currency, which determines the required precision. As {@link java.math.RoundingMode}, * by default, {@link java.math.RoundingMode#HALF_UP} is used. * @param providers the providers and ordering to be used. By default providers and ordering as defined in * #getDefaultProviders is used. * @return true, if a corresponding {@link javax.money.MonetaryRounding} is available. * @throws IllegalArgumentException if no such rounding is registered using a * {@link RoundingProviderSpi} instance. */ default boolean isRoundingAvailable(CurrencyUnit currencyUnit, String... providers) { return isRoundingAvailable(RoundingQueryBuilder.of().setProviderNames(providers).setCurrency(currencyUnit).build()); } }
protected static long amountToCents(final MonetaryAmount monetaryAmount) { final MonetaryRounding ROUNDING = ROUNDING_PROVIDER.getRounding(RoundingQueryBuilder.of().setRoundingName("default").setCurrency(monetaryAmount.getCurrency()) .build()); return monetaryAmount .with(ROUNDING) .query(amount -> queryFrom(monetaryAmount).longValue()); }
private static BigDecimal amountToPreciseAmount(final HighPrecisionMoneyImpl monetaryAmount) { final MonetaryRounding ROUNDING = ROUNDING_PROVIDER.getRounding(RoundingQueryBuilder.of().setRoundingName("default").setCurrency(monetaryAmount.getCurrency()) .build()); return monetaryAmount .with(ROUNDING) .query(amount -> queryFrom(monetaryAmount, monetaryAmount.getFractionDigits())); }