13

DecimalFormat を使用すると、この種の数値を使用する場合に解析例外が発生しません。

123こんにちは

これは明らかに実際の数値ではなく、123.0 の値に変換されます。この種の動作を回避するにはどうすればよいですか?

補足として、hello123 は例外を与えますが、これは正しいことです。

ありがとう、マルセル

4

3 に答える 3

9

正確な解析を行うには、次を使用できます

public Number parse(String text,
                ParsePosition pos)

pos を 0 に初期化すると、最後に使用された文字の後にインデックスが表示されます。

これを文字列の長さと比較して、解析が正確であることを確認できます。

http://download.oracle.com/javase/1.4.2/docs/api/java/text/DecimalFormat.html#parse%28java.lang.String,%20java.text.ParsePosition%29

于 2011-07-06T17:36:41.973 に答える
2

@Kalの答えを拡張して、「厳密な」解析を行うために任意のフォーマッターで使用できるユーティリティメソッドを次に示します(apache commons StringUtilsを使用)。

public static Object parseStrict(Format fmt, String value)
    throws ParseException
{
    ParsePosition pos = new ParsePosition(0);
    Object result = fmt.parseObject(value, pos);
    if(pos.getIndex() < value.length()) {
        // ignore trailing blanks
        String trailing = value.substring(pos.getIndex());
        if(!StringUtils.isBlank(trailing)) {
            throw new ParseException("Failed parsing '" + value + "' due to extra trailing character(s) '" +
                                     trailing + "'", pos.getIndex());
        }
    }
    return result;
}
于 2011-07-06T20:04:25.037 に答える
0

正規表現を使用して数値であることを確認できます。

String input = "123hello";
double d = parseDouble(input); // Runtime Error

public double parseDouble(String input, DecimalFormat format) throws NumberFormatException
{
    if (input.equals("-") || input.equals("-."))
       throw NumberFormatException.forInputString(input);
    if (!input.matches("\\-?[0-9]*(\\.[0-9]*)?"))
       throw NumberFormatException.forInputString(input);

    // From here, we are sure it is numeric.
    return format.parse(intput, new ParsePosition(0));
}
于 2011-07-06T17:39:39.090 に答える