首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带String.format舍入的Java String.format()

带String.format舍入的Java String.format()
EN

Stack Overflow用户
提问于 2014-10-30 04:02:09
回答 3查看 2.3K关注 0票数 2

我想使用String.format()将一些BigDecimals格式化为字符串的一部分:

代码语言:javascript
复制
// 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的特定精度)的刻度,但在本例中,我希望能够使用任意的模式字符串(包括非数字模式元素),因此我不知道要使用哪个比例。

因此,我的问题是:

  • 我可以设置String.format()使用的舍入模式吗?或
  • 是否有另一个格式化程序或库会格式化数字,如我的示例所示?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-09 15:10:48

真正“坚实”的建议,添加5000行自重代码到您的项目!据我所见,除非格式化程序已经设置到所需的范围,否则它不会设置刻度。因此,帮助它,解析格式字符串并设置缩放:

代码语言:javascript
复制
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左右

所以它使用正确的四舍五入。

票数 1
EN

Stack Overflow用户

发布于 2014-11-05 22:38:28

我可以设置String.format()使用的舍入模式吗?

简短回答:不。

是否还有另一个格式化程序或库会像我的示例那样格式化数字?

BigDecimal通过new MathContext(compPrec)或普通HALF_UP进行内部转换。您可以使用最新版本(或首选版本)的java.util.Formatter代码,并修改MathContext的创建以使用HALF_EVEN。工作时间应该是10-15分钟。但是,您需要一个自定义方法来模拟String.format

代码语言:javascript
复制
public static String format(String format, Object... args) {
    return new FormatterHALF_EVEN().format(format, args).toString();
}
票数 3
EN

Stack Overflow用户

发布于 2014-10-30 08:18:19

使用您喜欢的舍入模式设置刻度,并使用BigDecimal#toString()将格式字符串中的值作为字符串包括在内。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26644853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档