【问题标题】:Decimal separator in NumberFormatNumberFormat 中的小数分隔符
【发布时间】:2011-06-10 10:25:54
【问题描述】:

给定语言环境 java.text.NumberFormat:

NumberFormat numberFormat = NumberFormat.getInstance();

如何在该数字格式中获取用作小数分隔符的字符(如果它是逗号或点)?如何在不使用新的 DecimalFormat(format) 的情况下修改此属性?

谢谢

【问题讨论】:

    标签: java locale number-formatting


    【解决方案1】:

    帮助类 DecimalFomatSymbols 是您正在寻找的:

    DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance();
    DecimalFormatSymbols symbols = format.getDecimalFormatSymbols();
    char sep=symbols.getDecimalSeparator();
    

    根据需要设置符号:

    //create a new instance
    DecimalFormatSymbols custom=new DecimalFormatSymbols();
    custom.setDecimalSeparator(',');
    format.setDecimalFormatSymbols(custom);
    

    编辑:此答案仅对DecimalFormat 有效,不适用于问题中要求的NumberFormat。反正对作者有帮助,就放在这里吧。

    【讨论】:

    • 为了记录,Numberformat 是一个抽象类,所以你可能实际上有一个 DecimalFormat 对象。
    • @locster:DecimalFormatChoiceFormat 或未记录的 JDK 私有 NumberFormat 实现或 ...
    • 作为记录,这一行 DecimalFormat format=DecimalFormat.getInstance(); 无法编译,因为 getInstance() 方法返回 NumberFormat 对象。
    • 或者更安全; new DecimalFormat().getDecimalFormatSymbols().getDecimalSeparator()
    • 或者完全删除依赖:new DecimalFormatSymbols(Locale.getDefault(Locale.Category.FORMAT)).getDecimalSeparator()
    【解决方案2】:

    我同意 biziclopJoachim Sauer 的观点,即混淆小数和分组分隔符并手动完成这项工作会导致很多问题。在NumberFormat getInstance 方法中使用 locale 参数会自动为您完成所有工作。如果您愿意,您可以轻松禁用千位分组分隔符。

    以下 junit 测试方法(通过)显示了基于英语和德语语言环境的这种行为。

    public void testFormatter() {
        DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance(Locale.UK);
        assertEquals('.', formatter.getDecimalFormatSymbols().getDecimalSeparator()); //true
    
        formatter = (DecimalFormat) DecimalFormat.getInstance(Locale.GERMAN);
        assertEquals(',', formatter.getDecimalFormatSymbols().getDecimalSeparator()); //true
    
        //and in case you want another decimal seperator for a specific locale
        DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
        decimalFormatSymbols.setDecimalSeparator('.');
    
        formatter.setDecimalFormatSymbols(decimalFormatSymbols);
        assertEquals('.', formatter.getDecimalFormatSymbols().getDecimalSeparator()); //true
    }
    

    【讨论】:

      【解决方案3】:

      如果您的NumberFormat 实例是DecimalFormat,那么您可以使用getDecimalFormatSymbols() 来获取该信息。

      一般来说,您无法获得该信息。

      你为什么需要它?

      【讨论】:

      • 我想让用户可以使用逗号或点作为小数点分隔符,所以我需要用点替换逗号或用逗号替换点,具体取决于所使用的语言环境。
      • 好点。我忽略了他使用的是 NumberFormat 而不是 DecimalFormat。
      • 您可以为 Locale 设置默认的 DecimalFormatSymbols。
      • 这是一个潜在的危险想法,因为某些语言环境使用点作为组分隔符,使用逗号作为小数分隔符(例如“123.456,78”),切换它们可能会造成相当大的混乱。
      • @Javi:如果这就是您想要做的,那么您为什么不首先为用户区域设置正确的NumberFormat 呢?在一个语言环境中使用 NumberFormat 来调整 一些 参数以适应另一个语言环境,这听起来像是一场可怕的灾难!
      猜你喜欢
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 2012-09-05
      • 2018-10-12
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多