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