DecimalFormat を使用すると、この種の数値を使用する場合に解析例外が発生しません。
123こんにちは
これは明らかに実際の数値ではなく、123.0 の値に変換されます。この種の動作を回避するにはどうすればよいですか?
補足として、hello123 は例外を与えますが、これは正しいことです。
ありがとう、マルセル
DecimalFormat を使用すると、この種の数値を使用する場合に解析例外が発生しません。
123こんにちは
これは明らかに実際の数値ではなく、123.0 の値に変換されます。この種の動作を回避するにはどうすればよいですか?
補足として、hello123 は例外を与えますが、これは正しいことです。
ありがとう、マルセル
正確な解析を行うには、次を使用できます
public Number parse(String text,
ParsePosition pos)
pos を 0 に初期化すると、最後に使用された文字の後にインデックスが表示されます。
これを文字列の長さと比較して、解析が正確であることを確認できます。
@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;
}
正規表現を使用して数値であることを確認できます。
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));
}