是否忽略了java.text.DecimalFormat.setMaximumIntegraterDigits()?

是否忽略了java.text.DecimalFormat.setMaximumIntegraterDigits()?,java,validation,Java,Validation,我一直在尝试使用java.text.DecimalFormat验证用户输入的十进制数。我知道小数点之前和之后允许的最大位数-如果其中任何一位的位数更多,这是用户的输入错误。不过,似乎setMaximumIntegerDigits并没有被强制执行。或者,如果我使用一个模式,而不是最小/最大设置器,则该模式隐含的最大数字似乎再次被忽略 我错过了什么 如果这是一个重复的道歉。我可以在SO上找到很多关于DecimalFormat的问题,但似乎没有一个是这个问题 下面是从实际代码中提取的示例代码和单元测试

我一直在尝试使用java.text.DecimalFormat验证用户输入的十进制数。我知道小数点之前和之后允许的最大位数-如果其中任何一位的位数更多,这是用户的输入错误。不过,似乎setMaximumIntegerDigits并没有被强制执行。或者,如果我使用一个模式,而不是最小/最大设置器,则该模式隐含的最大数字似乎再次被忽略

我错过了什么

如果这是一个重复的道歉。我可以在SO上找到很多关于DecimalFormat的问题,但似乎没有一个是这个问题

下面是从实际代码中提取的示例代码和单元测试:

--Numbers.java

/** Utility for creating and using a standard DecimalFormat. */ 
package com.myco.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParsePosition;

public final class Numbers {

    private Numbers() { ; }

    public static DecimalFormat standardFormat() {
        DecimalFormat df = new DecimalFormat();
        df.setParseBigDecimal(true);
        df.setMaximumIntegerDigits(3);
        df.setMinimumIntegerDigits(1);
        df.setMaximumFractionDigits(2);
        df.setMinimumFractionDigits(0);
        return df;
    }

    // Alternatively, approach, also doesn't work.
    /*public static DecimalFormat standardFormat() {
        DecimalFormat df = new DecimalFormat("##0.##");
        df.setParseBigDecimal(true);
        return df;
    }*/

    public static BigDecimal match(DecimalFormat df, String s)
    throws NumberFormatException {
        if(s == null || (s = s.trim()).length() == 0)
            return null;
        ParsePosition pp = new ParsePosition(0);
        Number n = df.parse(s, pp);
        if(n == null || pp.getIndex() != s.length())
            throw new NumberFormatException(
                "Invalid BigDecimal for format '"+df+"'!");
        return BigDecimal.class.cast(n);
    }

}
根据我对Javadoc for DecimalFormat的阅读,下面1000的测试应该通过 也就是说,它应该抛出一个异常,但它没有

--数字测试.java

package com.myco.util;

import java.text.DecimalFormat;
import junit.framework.TestCase;

public final class Numbers_Test extends TestCase {

    public void testOkay() {
        DecimalFormat df = Numbers.standardFormat();
        assertEquals("0.1", Numbers.match(df, "0.1").toString());
        assertEquals("4.2", Numbers.match(df, "4.2").toString());
        assertEquals("999.99", Numbers.match(df, "999.99").toString());
    }

    public void testFail() {
        DecimalFormat df = Numbers.standardFormat();
        try {
            // Returns 1000 (as BigDecimal) but should fail (?).
            Numbers.match(df, "1000");
            fail();
        }
        catch(NumberFormatException e) { ; }
    }

}

setMaximum | MinimumIntegrater | FractionDigits方法的DecimalFormat和NumberFormat javadocs提到,在格式化或显示数字时使用这些属性。解析时没有使用这些属性。这是相当模糊的,但最终这些属性实际上只用于格式化。我确实想知道是否会是这样。但它也不适用于模式,例如0。如上所示,在备选方案中,注释掉了代码。当然,也应该应用一种模式进行解析吗?简单的回答是:是的,它根本没有效果。对于格式化,减少位数会产生错误的数字,是的,它应该解析格式化产生的相同值。您可以使用这些属性实现自己的格式类……那么您如何使用DecimalFormat进行简单的输入格式验证呢?我很确定你可以,因为很久很久以前,我似乎记得这样做是与JFormattedTextField一起进行的。你可以用它来验证输入是否是有效的数字。您不能使用它通过位数设置隐含的最大值。关于如何处理JFormattedTextField,您可以查看…