强制点(“。”)作为java中的小数分隔符

Posted

技术标签:

【中文标题】强制点(“。”)作为java中的小数分隔符【英文标题】:Force point (".") as decimal separator in java 【发布时间】:2011-07-11 07:11:33 【问题描述】:

我目前使用以下代码打印双精度:

return String.format("%.2f", someDouble);

这很好用,除了 Java 使用我的语言环境的小数分隔符(逗号)而我想使用点。有没有简单的方法可以做到这一点?

【问题讨论】:

如果您需要使用带有精确小数的双精度值,也许您应该使用 BigDecimal 而不是双精度/双精度。请参阅此link,了解您在使用双变量时可能遇到的问题。你也可以试试这个: System.out.println(5.1d + 1.1d); - 结果将是 6.199999999999999 而不是 6.2。我认为有人在研究如何将带小数的数字格式化为 String 必须跳过双变量。 【参考方案1】:

使用String.format 的重载,让您可以指定语言环境:

return String.format(Locale.ROOT, "%.2f", someDouble);

如果您 格式化数字 - 就像您在这里一样 - 那么使用 NumberFormat 可能更合适。但是,如果您需要 String.format 的其余格式化功能,这应该可以正常工作。

【讨论】:

Locale.ROOT 更中性。 @speedogoo:已编辑,虽然我怀疑数字格式没有任何区别。 是的,但您无需在美国和英国之间进行选择。 ? Locale.ROOT 也可以防止未来国家/地区选择的小数分隔符可能发生变化。 IMO 这并没有回答问题,而是 Locale.setDefault(new Locale("en", "US"));正如另一个答案中指出的那样。确实,由于它是全局性的,因此可能会产生不良副作用,作为程序员,我真正想要的是全局默认值是 US,因为在我的代码中我确实关心语言环境的其他任何地方,我都会明确地这样做。【参考方案2】:

更激进的解决方案是在 main() 的早期设置您的语言环境。

喜欢:

Locale.setDefault(new Locale("en", "US"));

【讨论】:

这是一个非常有问题的答案,因为它具有全局影响,因此可能会导致许多其他(可能是不受欢迎的)变化。 IMO 这是问题的正确答案,而且作为程序员,这也是我想要的。我希望 Java 默认使用美国语言环境,因为在我的代码中我实际需要本地化的任何地方我都会在我的代码中明确说明。也许只是我的习惯,但是当 printf/format 使用我的本地语言环境时非常烦人,因为十进制“逗号”与我使用的其他软件(任何人使用 Matlab)完全不兼容。【参考方案3】:

太晚了,但这里提到的其他示例是NumberFormat(及其子类DecimalFormat)的示例用法

public static String format(double num) 
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 

【讨论】:

我感觉创建DecimalFormatSymbols和设置分隔符应该做一次,在这个方法之前。【参考方案4】:

您可以将额外的语言环境传递给 java.lang.String.format 以及 java.io.PrintStream.printf(例如 System.out.printf()):

import java.util.Locale;

public class PrintfLocales 

    public static void main(String args[]) 
        System.out.printf("%.2f: Default locale\n", 3.1415926535);
        System.out.printf(Locale.GERMANY, "%.2f: Germany locale\n", 3.1415926535);
        System.out.printf(Locale.US, "%.2f: US locale\n", 3.1415926535);
    


这会导致以下结果(在我的 PC 上):

$ java PrintfLocales
3.14: Default locale
3,14: Germany locale
3.14: US locale

请参阅 Java API 中的 String.format。

【讨论】:

您也可以使用out.printf((Locale)null, ...)out.format((Locale)null, ...) 来获得与区域无关的表示。 (还有Locale.ROOT【参考方案5】:

您可以使用 NumberFormat 和 DecimalFormat。

查看来自 Java 教程 LocaleSpecific Formatting 的此链接

标题为区域设置敏感格式的部分是您所需要的。

【讨论】:

【参考方案6】:

更改语言,它对我有用。

如何设置 Eclipse 控制台区域设置/语言 How to set eclipse console locale/language

【讨论】:

【参考方案7】:

我遇到了同样的问题.. 55.1 转换为 55,10。 我的快速(肮脏?)修复是:

String.format("%.2f", value).replaceAll(",",".");

【讨论】:

只有在有人尝试在不同的语言环境中运行您的代码时才有效。不是真正的解决方案。 -1

以上是关于强制点(“。”)作为java中的小数分隔符的主要内容,如果未能解决你的问题,请参考以下文章

强制具有类型编号的 TextField 将点显示为小数分隔符

NumericUpDown:接受逗号和点作为小数分隔符

如何禁止逗号作为小数分隔符

无论语言环境如何,我如何强制使用点而不是逗号的 Swift Decimal Pad?

以逗号作为小数分隔符的数据框

java中不能使用小数点(.)来作为分隔符