如何打印不带逗号的双精度数值

13

在使用 toString() 方法时,Double 类型会自动添加逗号(例如 5143 会被打印为 5,143)。如何禁止这种行为?


我用这段代码得不到分隔符:String str = Double.toString(5143); - tur1ng
1
@tur1ng:你的本地设置与Erik的设置不同。 @Bozho:它不是十进制分隔符,而是用于在某些区域中分组数字的千位分隔符。在我看来,这是一种相当奇怪的做法——为了进一步混淆事情,在某些区域中使用相同的符号(,)作为十进制分隔符。 - Joonas Pulakka
它不一定是十进制分隔符。例如,在俄语环境中,, 是数字分组符号,而小数分隔符是 .。因此,在美国环境中看起来像 5143.5 的数字,在俄罗斯环境中则是 5,143.5 - Rorick
10个回答

15

你的问题属于Locale范畴,正如Rorick所指出的那样。然而,如果改变Locale会导致一切混乱,你应该查看DecimalFormat类。

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


9

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

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

7
据我所知,您无法禁用toString()方法返回的内容。
我的解决方案如下:
someDouble.toString().replaceAll(",", "");

这并不是最优雅的解决方案,但它能够运行。


5
个人认为这只是一种“hack”,并不是解决方案。 - Rorick
+1 因为我写了同样的代码 :). 我觉得它并不“不优雅”(甚至比其他帖子中的本地化处理更好),因为它没有副作用,而且正好做到了预期的效果。 - Kai Huppmann
@Rorick:这不仅是一个解决方案,而且是最好的解决方案。 - Kai Huppmann
3
如果您的程序仅供个人家庭使用。 - Rorick
1
如果你不想要逗号,那么这是一个普遍的解决方案。如果你想完全没有分隔符,你必须加强它(但类似!)。如果你想通过操作区域设置来解决这个问题,你会有副作用,并且你不能确定在其他地方会发生什么,或者你需要在罗马尼亚(和其他地方)使用你的美国区域设置运行程序。 所以,如果问题是格式化双精度浮点数(而不是日期、货币等),那么就通过格式化双精度浮点数来解决它。
如果只是你的程序是为了你个人家庭使用而已。<
恰恰相反。
- Kai Huppmann

5

Java使用NumberFormat类提供了出色的本地化数字格式化支持:

使用当前语言环境:

NumberFormat.getNumberInstance().format(5000000);

使用瑞典语区域设置将获得字符串:5 000 000

...或者使用特定的区域设置(例如法语,也会得到5 000 000):

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

4
myDouble.toString().replaceAll(",", "");

请查看Bozho的帖子,链接为https://dev59.com/9nE95IYBdhLWcg3wlu-z#2242921。他的观点非常有价值且很有道理。 - Adeel Ansari
我必须承认,我完全不明白他的观点... 他似乎在谈论小数分隔符而不是数字组分隔符(这个问题所涉及的内容)。 - Kai Huppmann
@kai1968:他提供的示例是整数值,并提到Double会添加逗号。所以,我倾向于同意他的观点。我认为他需要回来澄清这里的困惑。 - Adeel Ansari
这段代码在小数点分隔符为“,”且myDouble为1.5之类的分数时,会出现什么问题呢?在许多欧洲地区,美国人写作1.5的数字会被格式化为“1,5”,而这段代码会将其转换为“15”。不是吗? - Spike0xff

3

可能需要更改您的区域设置。默认情况下,系统语言环境将被采用,但您可以覆盖此设置。请阅读 Locale 类的 javadoc 和这个 小教程 来开始了解。可以通过命令行指定语言环境:

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

+1。其实我正在写同样的东西。不管怎样,我写了一篇补充的帖子。 :) - Adeel Ansari

3

三种方式:

  1. Using the DecimalFormat

    DecimalFormat df = new DecimalFormat();
    DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
    dfs.setGroupingSeparator(Character.MAX_VALUE);
    df.setDecimalFormatSymbols(dfs);
    System.out.println(df.format(doubleVar));
    
  2. (as suggested by others) just replace the comma in the string that you get

  3. Set the locale on load of your VM

3
我使用这种方法将双精度浮点数格式化为字符串,固定区域设置、无分组,并且指定小数位数的最小值和最大值。
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;       
 }

2

NumberFormat format = NumberFormat.getInstance();

format.setGroupingUsed(false);

这段代码是用于格式化数字的。第一行代码创建了一个NumberFormat实例,该实例可以用来格式化数字。第二行代码将设置不使用分组符号,即千位分隔符。

这是不完整的,似乎有些冗余。NumberFormat从哪里导入? - AJ X.

-2
Double result= 5143.0;

Sysout(result.toString()) 

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接