我想使用String.format()将一些BigDecimals格式化为字符串的一部分:
// 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"但是,文档 for String.format()说,BigDecimals的任何舍入都将使用HALF_UP舍入来完成,而我需要HALF_EVEN。
我知道如何手动设置BigDecimals (设置BigDecimal的特定精度)的刻度,但在本例中,我希望能够使用任意的模式字符串(包括非数字模式元素),因此我不知道要使用哪个比例。
因此,我的问题是:
发布于 2014-11-09 15:10:48
真正“坚实”的建议,添加5000行自重代码到您的项目!据我所见,除非格式化程序已经设置到所需的范围,否则它不会设置刻度。因此,帮助它,解析格式字符串并设置缩放:
public static String getPrice(String pattern) {
BigDecimal basePrice = new BigDecimal("23");
BigDecimal vatRate = new BigDecimal("0.5");
BigDecimal price = basePrice.multiply(BigDecimal.ONE.add(vatRate));
BigDecimal priceInPence = price.multiply(new BigDecimal("100"));
BigDecimal annualPrice = price.multiply(new BigDecimal("365"));
Matcher matcher = Pattern.compile("%(\\d+)\\$.(\\d+)f").matcher(pattern);
while (matcher.find()) {
String index = matcher.group(1);
int scale = Integer.parseInt(matcher.group(2));
if (index.equals("1"))
priceInPence = priceInPence.setScale(scale, RoundingMode.HALF_EVEN);
else if (index.equals("2"))
annualPrice = annualPrice.setScale(scale, RoundingMode.HALF_EVEN);
}
return String.format(pattern, priceInPence, annualPrice);
}通过这些数字,我得到了这个输出:
你方价格为3450.000便士/天(£12592.50/年),包括增值税 年£12592左右
所以它使用正确的四舍五入。
发布于 2014-11-05 22:38:28
我可以设置String.format()使用的舍入模式吗?
简短回答:不。
是否还有另一个格式化程序或库会像我的示例那样格式化数字?
BigDecimal通过new MathContext(compPrec)或普通HALF_UP进行内部转换。您可以使用最新版本(或首选版本)的java.util.Formatter代码,并修改MathContext的创建以使用HALF_EVEN。工作时间应该是10-15分钟。但是,您需要一个自定义方法来模拟String.format。
public static String format(String format, Object... args) {
return new FormatterHALF_EVEN().format(format, args).toString();
}发布于 2014-10-30 08:18:19
使用您喜欢的舍入模式设置刻度,并使用BigDecimal#toString()将格式字符串中的值作为字符串包括在内。
https://stackoverflow.com/questions/26644853
复制相似问题