DecimalFormat 用非数字转换数字

Posted

技术标签:

【中文标题】DecimalFormat 用非数字转换数字【英文标题】:DecimalFormat converts numbers with non-digits 【发布时间】:2011-07-06 17:28:43 【问题描述】:

在使用这种数字时,使用 DecimalFormat 不会产生解析异常:

123你好

这显然不是一个真正的数字,并转换为 123.0 值。我怎样才能避免这种行为?

作为旁注,hello123 确实给出了一个例外,这是正确的。

谢谢, 马塞尔

【问题讨论】:

看看这个***.com/questions/4324997/… 【参考方案1】:

要进行精确解析,您可以使用

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

【讨论】:

API 不允许这样做的唯一遗憾:decimalFormat.setStrict(true) (严格的意思是不允许 123hello 作为数字)。关键是你不能总是控制自己解析的调用。其他库可能会使用格式对象。非常感谢您的回复!【参考方案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;

【讨论】:

【参考方案3】:

您可以使用 RegEx 验证它是数字:

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));

【讨论】:

你的代码除了 Double.parseDouble("123hello") 没有带来任何东西。 DecimalFormat 的重点是解析国际化数字。 123 456,78 是法语语言环境中的有效十进制数。 @JB:确实,我想快点:D

以上是关于DecimalFormat 用非数字转换数字的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 VBA 的情况下在 Excel 中转换 HEX 和 DEC 之间的大数字?

String.format() 和 DecimalFormat 实际上没有格式化

DecimalFormat 解析数字错误。为啥?

Java DecimalFormat 用法(数字格式化)

(转)Java DecimalFormat 用法(数字格式化)

当十进制为 0 时,DecimalFormat.parse() 的转换结果时发生 ClassCastException