java.text.DecimalFormat.setMaximumIntegerDigits()被忽略了吗?

时间:2014-06-18 11:39:04

标签: java validation

我一直在尝试使用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);
    }

}

通过阅读DecimalFormat的Javadoc,1000(下图)的测试应该通过 (也就是说,它应该抛出异常),但它没有。

http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

---- Numbers_Test.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) { ; }
    }

}

0 个答案:

没有答案