【问题标题】:how to print a Double without commas如何打印不带逗号的 Double
【发布时间】:2010-02-11 07:28:46
【问题描述】:

使用toString() 时,Double 添加逗号(5143 打印为 5,143)。 如何禁用逗号?

【问题讨论】:

  • 我没有得到这个代码的分隔符:String str = Double.toString(5143);
  • @tur1ng:您的区域设置与 Erik 的设置不同。 @Bozho:它不是小数分隔符,它是用于在某些语言环境中对数字进行分组的 千位分隔符。恕我直言,这是一种非常奇怪的做法 - 为了进一步搞砸,在某些语言环境中,相同的符号 (,) 被用作小数分隔符。
  • 不一定是小数分隔符。例如,在俄语语言环境中,, 是数字分组符号,而小数分隔符是 .。所以在美国语言环境中看起来像 5143.5 在俄罗斯语言环境中是 5,143.5

标签: java formatting double


【解决方案1】:

正如 Rorick 正确指出的那样,您的问题属于语言环境。但是,您应该查看DecimalFormat 类,以防更改区域设置意味着搞砸所有事情。

NumberFormat类,处理千位分隔符。因为您的情况似乎是关于千位分隔符。

【讨论】:

    【解决方案2】:

    这将删除所有分组(在您的情况下为逗号)。

    DecimalFormat df = new DecimalFormat();
    df.setGroupingUsed(false);
    

    【讨论】:

      【解决方案3】:

      据我所知,您不能禁用 toString() 方法返回的内容。

      我的解决方案如下:

      someDouble.toString().replaceAll(",", "");
      

      不是最优雅的解决方案,但它确实有效。

      【讨论】:

      • 这是一个 hack,而不是解决方案,恕我直言。
      • +1 因为我写的一样:)。我不觉得它“不优雅”(甚至比其他帖子中的语言环境处理更好),因为它没有副作用并且完全符合预期。
      • @Rorick:这不仅是一个解决方案,而且是最好的解决方案。
      • 如果您的程序只供您个人家庭使用。
      • 如果您不想要逗号,这是一个无处不在的解决方案。如果您根本不需要分隔符,则必须对其进行增强(但类似!!)。如果您想通过操作语言环境来解决此问题,则会产生副作用,并且您无法确定其他地方发生了什么,或者您需要在罗马尼亚(以及其他任何地方)使用您的美国语言环境运行程序。因此,如果问题是格式化 Doubles(而不是 Dates 或 Currencies 或 ....),那么通过格式化 Doubles 来解决它。 >如果您的程序仅用于您的个人家庭使用。
      【解决方案4】:

      Java 对使用 NumberFormat 类在不同语言环境中格式化文本中的数字提供了出色的支持:

      使用当前语言环境:

      NumberFormat.getNumberInstance().format(5000000);
      

      将为您提供(使用瑞典语言环境)字符串:5 000 000

      ...或使用特定的语言环境(例如法语,这也会导致 5 000 000):

      NumberFormat.getNumberInstance(Locale.FRANCE).format(5000000);
      

      【讨论】:

        【解决方案5】:
        myDouble.toString().replaceAll(",", "");
        

        【讨论】:

        • 查看 Bozho 的帖子,stackoverflow.com/questions/2242878/…。他的观点很有道理,很有道理。
        • 我不得不承认我根本不明白他的意思......似乎他在谈论小数分隔符而不是数字组分隔符(这个问题是关于)。
        • @kai1968:他提供的例子是整数值,并提到Double加了逗号。所以,我倾向于同意。我认为他需要回来消除这里的混乱。
        • 在小数点分隔符为“,”且 myDouble 是 1.5 之类的小数的语言环境中,什么可以防止这种行为不正常?在许多欧洲地区,美国人写为 1.5 的内容将被格式化为“1,5”,此代码将转换为“15”。 N'est-ce 过去了吗?
        【解决方案6】:

        您可能必须更改您的区域设置。它默认取自系统语言环境,但您可以覆盖它。阅读 Locale 类的 javadoc 和这个 little tutorial 开始。可以通过命令行指定语言环境:

        java -Duser.language=en -Duser.region=US MyApplication
        

        【讨论】:

        • +1。实际上,我正在写同样的东西。无论如何,我写了一篇补充文章。 :)
        【解决方案7】:

        三种方式:

        1. 使用DecimalFormat

          DecimalFormat df = new DecimalFormat();
          DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
          dfs.setGroupingSeparator(Character.MAX_VALUE);
          df.setDecimalFormatSymbols(dfs);
          System.out.println(df.format(doubleVar));
          
        2. (根据其他人的建议)只需替换您得到的字符串中的逗号

        3. 在加载 VM 时设置语言环境

        【讨论】:

          【解决方案8】:

          我使用这种方法将双精度格式设置为具有固定语言环境的字符串,没有分组并且使用 小数位数的最小值和最大值

          public String formatNumber(double number){
              NumberFormat nf = NumberFormat.getInstance(new Locale("en", "EN"));
              nf.setMaximumFractionDigits(3);  
              nf.setMinimumFractionDigits(1);
              nf.setGroupingUsed(false);
              String str = nf.format(number);
              return str;       
           }
          

          【讨论】:

            【解决方案9】:

            NumberFormat 格式 = NumberFormat.getInstance();

            format.setGroupingUsed(false);

            【讨论】:

            • 这是不完整的,似乎是多余的。 NumberFormat 是从哪里导入的?
            【解决方案10】:
            Double result= 5143.0;
            
            Sysout(result.toString()) 
            

            给我5143.0... 你能把你得到的代码放上去吗

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-01-10
              • 2022-10-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-09-11
              相关资源
              最近更新 更多