为什么十进制格式允许字符作为后缀?

2022-09-03 06:11:12

我正在使用解析/验证用户输入。不幸的是,它允许在解析时将字符作为后缀。DecimalFormat

示例代码:

try {
  final NumberFormat numberFormat = new DecimalFormat();
  System.out.println(numberFormat.parse("12abc"));
  System.out.println(numberFormat.parse("abc12"));
} catch (final ParseException e) {
  System.out.println("parse exception");
}

结果:

12
parse exception

我实际上希望它们都有一个解析异常。我怎么能说不允许输入?DecimalFormat"12abc"


答案 1

来自 NumberFormat.parse 的文档:

分析给定字符串开头的文本以生成数字。该方法不能使用给定字符串的整个文本。

下面是一个示例,应该可以让您了解如何确保考虑整个字符串。

import java.text.*;

public class Test {
    public static void main(String[] args) {
        System.out.println(parseCompleteString("12"));
        System.out.println(parseCompleteString("12abc"));
        System.out.println(parseCompleteString("abc12"));
    }

    public static Number parseCompleteString(String input) {
        ParsePosition pp = new ParsePosition(0);
        NumberFormat numberFormat = new DecimalFormat();
        Number result = numberFormat.parse(input, pp);
        return pp.getIndex() == input.length() ? result : null;
    }
}

输出:

12
null
null

答案 2

使用该方法的重载,并在解析后检查 ParsePosition 的 .getIndex(),以查看它是否与输入的长度匹配。parse(String, ParsePosition)


推荐