in fontbox/src/main/java/org/apache/fontbox/type1/Type1Lexer.java [254:373]
private Token tryReadNumber() throws IOException
{
buffer.mark();
StringBuilder sb = new StringBuilder();
StringBuilder radix = null;
char c = getChar();
boolean hasDigit = false;
// optional + or -
if (c == '+' || c == '-')
{
sb.append(c);
c = getChar();
}
// optional digits
while (Character.isDigit(c))
{
sb.append(c);
c = getChar();
hasDigit = true;
}
// optional .
if (c == '.')
{
sb.append(c);
c = getChar();
}
else if (c == '#')
{
// PostScript radix number takes the form base#number
radix = sb;
sb = new StringBuilder();
c = getChar();
}
else if (sb.length() == 0 || !hasDigit)
{
// failure
buffer.reset();
return null;
}
else if (c != 'e' && c != 'E')
{
// integer
buffer.position(buffer.position() -1);
return new Token(sb.toString(), Token.INTEGER);
}
// required digit
if (Character.isDigit(c))
{
sb.append(c);
c = getChar();
}
else if (c != 'e' && c != 'E')
{
// failure
buffer.reset();
return null;
}
// optional digits
while (Character.isDigit(c))
{
sb.append(c);
c = getChar();
}
// optional E
if (c == 'E' || c == 'e')
{
sb.append(c);
c = getChar();
// optional minus
if (c == '-')
{
sb.append(c);
c = getChar();
}
// required digit
if (Character.isDigit(c))
{
sb.append(c);
c = getChar();
}
else
{
// failure
buffer.reset();
return null;
}
// optional digits
while (Character.isDigit(c))
{
sb.append(c);
c = getChar();
}
}
buffer.position(buffer.position() - 1);
if (radix != null)
{
int val;
try
{
val = Integer.parseInt(sb.toString(), Integer.parseInt(radix.toString()));
}
catch (NumberFormatException ex)
{
throw new IOException("Invalid number '" + sb + "'", ex);
}
return new Token(Integer.toString(val), Token.INTEGER);
}
return new Token(sb.toString(), Token.REAL);
}