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