【问题标题】:How to format this string如何格式化这个字符串
【发布时间】:2014-10-13 10:38:53
【问题描述】:

我有钱

Long amount=83000;

我需要将其格式化为$83.000,该怎么做?

NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "US"));

String moneyString = formatter.format(amount);

System.out.println(moneyString);

我收到了$83000.00,但我希望我的观点在最后三位之前

【问题讨论】:

  • 不,我想要 83.000 美元,如果金额是 67890,那么输出将是 67.890 美元,如果有任何想法请帮忙
  • 你的意思是 $83.000 是 83 美元还是 83 美元?
  • 在我们. 是小数分隔符,, 是千位分隔符,在大多数欧洲国家是其他方式。因此,如果您真的想以欧洲格式显示您的号码,请尝试使用NumberFormat formatter = NumberFormat.getNumberInstance(Locale.GERMANY);,然后在格式化您的号码后附加您的货币字符串

标签: java number-formatting


【解决方案1】:

这可能对你有帮助,

 DecimalFormat myFormatter = new DecimalFormat("$###,###.###");
 String output = myFormatter.format(amount);
 System.out.println(output);

【讨论】:

    【解决方案2】:

    您使用了错误的类。 NumberFormatter 将提供特定于区域设置的格式。来自 API 文档:

    您的代码可以完全独立于小数点、千位分隔符甚至使用的特定十进制数字的区域设置约定,或者数字格式是否为十进制。

    如果您打算输出相同的字符串而不考虑操作系统的当前语言环境,您应该查看DecimalFormat

    通过创建诸如"$#,##0" 之类的格式化字符串并传递DecimalFormatSymbols 的实例,您将在其中将分组字符设置为'.',您将获得预期的输出,而无需修改。

    【讨论】:

    • @ToyOno 下面有一个答案可以说明这一点。
    • 但是对于这个数字 8389000 它显示 o/p 8.389.000,有什么办法可以在 8 之后去除多余的点吗??
    • 这是原始问题中不存在的附加要求。它似乎非常自定义,并且可能不受 DecimalFormat 支持,因此您也可以使用自定义解决方案:只需手动从字符串中删除多余的点。
    【解决方案3】:

    这个怎么样?

    long num = 83000;
    DecimalFormat df = new DecimalFormat("##,###");
    String toReplace = df.format(83000).toString();
    System.out.println(toReplace.replace(",", "."));
    

    【讨论】:

      【解决方案4】:

      这应该可行:

      DecimalFormatSymbols symbols = new DecimalFormatSymbols(new Locale("en", "US"));
      symbols.setDecimalSeparator(',');
      symbols.setGroupingSeparator('.'); 
      DecimalFormat df = new DecimalFormat("$#,##0", symbols);
      System.out.println(df.format(83000L));
      //$83.000
      

      【讨论】:

      • 为什么格式字符串中有多余的 0?我认为只有在预先插入字符串时才有意义 - 确保零填充值。
      • 没有额外的 0,我得到 $8.30.00
      • 此处的点仅在 3 位之前,但在此方法中,点将在每 3 位之前。
      • $8.367.889 我得到了 8367889,我想要它在 3 位之前返回一个点的金额,比如这个 8367889 输出将是 8367.889
      • 变得复杂了 ;)
      【解决方案5】:

      也许你是这个意思?

      public static void main(String[] args) {
          Long amount = 67890L;
          NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "US"));
          String moneyString = formatter.format((double) amount / 1000);
          System.out.println(moneyString);
      }
      

      此代码将打印:

      67.89 美元

      【讨论】:

      • ..注意问题表明他想看到$67.890(用点作为千位分隔符)
      • 我知道。但这可能是一个错误的决定,所以我在这里提出的建议是最简单和最好的,因此我说:“也许你是这个意思?”
      • 我说“可能”。有时人们对技术问题提出了错误的要求。我提了,没说。我的解决方案很简单,可以考虑。只是想帮忙……
      • 也许您应该将答案转换为评论:-)
      【解决方案6】:

      使用BigDecimal 代替Long 进行格式化:

      BigDecimal bd = BigDecimal.valueOf(amount, 3);
      NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en","US"));
      formatter.setMinimumFractionDigits(3);
      String moneyString = formatter.format(bd);    
      System.out.println(moneyString);
      

      【讨论】:

      • 这是非常低效的,因为您正在为每个数字创建一个新的 BigDecimal 仅用于格式化。使用 DecimalFormat,您可以以更有效(且不那么骇人听闻)的方式重用格式。
      • 这更好,我将删除我的反对票:-) 但它似乎是一种迂回的方式(特别是因为它使用了 FractionDigits)。
      • @ljgw 3 个小数位不是美国语言环境的货币格式,因此您需要调整标准格式或使用自己的模式:“¤#.000”。
      猜你喜欢
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2013-08-02
      • 1970-01-01
      相关资源
      最近更新 更多