Я хотел бы использовать string.Format() форматировать некоторые BigDecimals как часть строки:Java string.Format() с HALF_EVEN округление
// Example:
String getPrice(String pattern)
{
BigDecimal price = basePrice.multiply(BigDecimal.ONE.add(vatRate));
BigDecimal priceInPence = price.multiply(new BigDecimal("100"));
BigDecimal annualPrice = price.multiply(new BigDecimal("365"));
return String.format(pattern, priceInPence, annualPrice);
}
String myPrice1 = getPrice("Your price is %1$.3fp/day (£2$.2f/year) including VAT");
// --> "Your price is 32.100p/day (£117.16/year) including VAT"
String myPrice2 = getPrice("Around £%2$.0f annualy");
// --> "Around £117 annually"
Однако docs для string.Format () говорят, что любое округление BigDecimals будет выполнено с округлением HALF_UP, тогда как мне нужно HALF_EVEN.
Я знаю, как вручную установить масштаб BigDecimals (Set specific precision of a BigDecimal) - но в этом случае я хочу иметь возможность использовать произвольную строку шаблона (включая нечисловые элементы шаблона), поэтому я не буду знать заранее какой масштаб использовать.
Мой вопрос таким образом:
можно установить режим округления, используемый string.Format()? OR
есть другой форматтер или библиотека, которая будет форматировать номера, как в моем примере?
Взгляните на java.math.MathContext. Вы можете построить MathContext, используя java.math.RoundingMode (HALF_EVEN), а затем передать это конструктору BigDecimal или одному из методов умножения: 'multiply (BigDecimal multipicand, MathContext mc)' – mttdbrd
@mttdbrd - извините, я должно быть ясно, мне нужна произвольная точность, основанная на шаблоне (см. мое редактирование выше). –
http://stackoverflow.com/questions/9482889/set-specific-precision-of-a-bigdecimal и http://stackoverflow.com/questions/15352229/rounding-mode-with-bigdecimal-in-java – ComputerFellow