Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
 /*
  * Copyright (c) 2013, Francis Galiegue <fgaliegue@gmail.com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the Lesser GNU General Public License as
  * published by the Free Software Foundation, either version 3 of the
  * License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Lesser GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.github.fge.jsonschema.keyword.digest.helpers;
A specialized digester for numeric keywords

This digester ensures that, for instance, values 1, 1.0 and 1.00 produce the same digest. It also stores another important information: whether that number can be reliably represented as a long. If this is not the case, for accuracy reasons, java.math.BigDecimal is used.

public abstract class NumericDigester
    extends AbstractDigester
    protected NumericDigester(final String keyword)
    {
        super(keyword..);
    }
    private static boolean valueIsLong(final JsonNode node)
    {
        if (!node.canConvertToLong())
            return false;
        if (NodeType.getNodeType(node) == .)
            return true;
        return node.decimalValue().remainder(.)
            .compareTo(.) == 0;
    }
    protected final ObjectNode digestedNumberNode(final JsonNode schema)
    {
        final ObjectNode ret = .objectNode();
        final JsonNode node = schema.get();
        final boolean isLong = valueIsLong(node);
        ret.put("valueIsLong"isLong);
        if (isLong) {
            ret.put(node.canConvertToInt()
                ? .numberNode(node.intValue())
                : .numberNode(node.longValue()));
            return ret;
        }
        final BigDecimal decimal = node.decimalValue();
        ret.put(decimal.scale() == 0
            ? .numberNode(decimal.toBigIntegerExact())
            : node);
        return ret;
    }
New to GrepCode? Check out our FAQ X