<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>COSNumber.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Apache PDFBox</a> &gt; <a href="index.source.html" class="el_package">org.apache.pdfbox.cos</a> &gt; <span class="el_source">COSNumber.java</span></div><h1>COSNumber.java</h1><pre class="source lang-java linenums">/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the &quot;License&quot;); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.pdfbox.cos;

import java.io.IOException;

/**
 * This class represents an abstract number in a PDF document.
 *
 * @author Ben Litchfield
 */
<span class="fc" id="L26">public abstract class COSNumber extends COSBase</span>
{
    /**
     * This will get the float value of this number.
     *
     * @return The float value of this object.
     */
    public abstract float floatValue();

    /**
     * This will get the integer value of this number.
     *
     * @return The integer value of this number.
     */
    public abstract int intValue();

    /**
     * This will get the long value of this number.
     *
     * @return The long value of this number.
     */
    public abstract long longValue();

    /**
     * This factory method will get the appropriate number object.
     *
     * @param number The string representation of the number.
     *
     * @return A number object, either float or int.
     *
     * @throws IOException If the string is not a number.
     */
    public static COSNumber get( String number ) throws IOException
    {
<span class="fc bfc" id="L60" title="All 2 branches covered.">        if (number.length() == 1)</span>
        {
<span class="fc" id="L62">            char digit = number.charAt(0);</span>
<span class="fc bfc" id="L63" title="All 4 branches covered.">            if ('0' &lt;= digit &amp;&amp; digit &lt;= '9') </span>
            {
<span class="fc" id="L65">                return COSInteger.get((long) digit - '0');</span>
            } 
<span class="fc bfc" id="L67" title="All 4 branches covered.">            if (digit == '-' || digit == '.')</span>
            {
                // See https://issues.apache.org/jira/browse/PDFBOX-592
<span class="fc" id="L70">                return COSInteger.ZERO;</span>
            } 
<span class="fc" id="L72">            throw new IOException(&quot;Not a number: &quot; + number);</span>
        } 
<span class="fc bfc" id="L74" title="All 2 branches covered.">        if (isFloat(number))</span>
        {
<span class="fc" id="L76">            return new COSFloat(number);</span>
        }
        try
        {
<span class="fc" id="L80">            return COSInteger.get(Long.parseLong(number));</span>
        }
<span class="fc" id="L82">        catch (NumberFormatException e)</span>
        {
            // check if the given string could be a number at all
<span class="pc bpc" id="L85" title="2 of 4 branches missed.">            String numberString = number.startsWith(&quot;+&quot;) || number.startsWith(&quot;-&quot;)</span>
<span class="pc" id="L86">                    ? number.substring(1) : number;</span>
<span class="fc bfc" id="L87" title="All 2 branches covered.">            if (!numberString.matches(&quot;[0-9]*&quot;))</span>
            {
<span class="fc" id="L89">                throw new IOException(&quot;Not a number: &quot; + number);</span>
            }
            // return a limited COSInteger value which is marked as invalid
<span class="pc bpc" id="L92" title="1 of 2 branches missed.">            return number.startsWith(&quot;-&quot;) ? COSInteger.OUT_OF_RANGE_MIN</span>
<span class="fc" id="L93">                    : COSInteger.OUT_OF_RANGE_MAX;</span>
        }
    }

    private static boolean isFloat( String number )
    {
<span class="fc" id="L99">        int length = number.length();</span>
<span class="fc bfc" id="L100" title="All 2 branches covered.">        for (int i = 0; i &lt; length; i++)</span>
        {
<span class="fc" id="L102">            char digit = number.charAt(i);</span>
<span class="fc bfc" id="L103" title="All 4 branches covered.">            if (digit == '.' || digit == 'e')</span>
            {
<span class="fc" id="L105">                return true;</span>
            }
        }
<span class="fc" id="L108">        return false;</span>
    }
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.8.202204050719</span></div></body></html>