NumberParser assignReal()

in src/main/java/org/apache/commons/jexl3/parser/NumberParser.java [210:256]


    NumberParser assignReal(final boolean negative, final String s) {
        Number result;
        Class<? extends Number> rclass;
        if ("#NaN".equals(s) || "NaN".equals(s)) {
            result = Double.NaN;
            rclass = Double.class;
        } else {
            final int last = s.length() - 1;
            switch (s.charAt(last)) {
                case 'b':
                case 'B': {
                    rclass = BigDecimal.class;
                    final BigDecimal bd = new BigDecimal(s.substring(0, last));
                    result = negative? bd.negate() : bd;
                    break;
                }
                case 'f':
                case 'F': {
                    rclass = Float.class;
                    final float f4 = Float.parseFloat(s.substring(0, last));
                    result = negative? -f4 : f4;
                    break;
                }
                case 'd':
                case 'D':
                    rclass = Double.class;
                    final double f8 = Double.parseDouble(s.substring(0, last));
                    result = negative? -f8 : f8;
                    break;
                default: {
                    // preferred literal class is double
                    rclass = Double.class;
                    try {
                        final double d = Double.parseDouble(s);
                        result = negative? -d : d;
                    } catch (final NumberFormatException take3) {
                        final BigDecimal bd = new BigDecimal(s);
                        result = negative? bd.negate() : bd;
                    }
                    break;
                }
            }
        }
        literal = result;
        clazz = rclass;
        return this;
    }