/** * Access roundings using a MonetaryContext. Use different * MathContext/RoundingMode, as an attribute, when running * on the JDK. */ @Test(description = "4.2.7 Ensure correct MonetaryRounding returned for a mathematical RoundingQuery.") @SpecAssertion(section = "4.2.7", id = "427-C2") public void testAccessRoundingsWithRoundingContext() { RoundingQuery ctx = RoundingQueryBuilder.of().setScale(1).set(RoundingMode.UP).build(); MonetaryOperator r = Monetary.getRounding(ctx); AssertJUnit.assertNotNull("Section 4.2.7: No rounding provided for RoundingQuery: " + ctx, r); MonetaryAmount m = new TestMonetaryAmountBuilder().setNumber(new BigDecimal("12.123456789101222232323")).setCurrency("CHF") .create(); AssertJUnit.assertEquals("Section 4.2.7: Invalid rounding provided for RoundingQuery: " + ctx, "CHF 12.2", m.with(r).toString()); }
private MonetaryOperator createUsingMonetaryContext( MonetaryContext context, MonetaryContextBuilder monetaryContextBuilder) { MathContext mathContext = context.get(MathContext.class); if (Objects.isNull(mathContext)) { RoundingMode roundingMode = context.get(RoundingMode.class); if (Objects.nonNull(roundingMode)) { int scale = ofNullable(context.getInt("scale")).orElse(SCALE_DEFAULT); monetaryContextBuilder.set(roundingMode); monetaryContextBuilder.set("scale", scale); return Monetary.getRounding(RoundingQueryBuilder.of() .setScale(scale).set(roundingMode).build()); } else { return Monetary.getDefaultRounding(); } } else { monetaryContextBuilder.set(mathContext.getRoundingMode()); monetaryContextBuilder.set("scale", SCALE_DEFAULT); return Monetary.getRounding(RoundingQueryBuilder.of().set(mathContext) .setScale(SCALE_DEFAULT).build()); } } }