public static PreciseDecimal parse(final String s)
  {
	int factor = 0;
	long base = 0;
	int i = 0;
	boolean fractional = false;
	final boolean neg;
	if (s.charAt(i) == '-')
	{
	  neg = true;
	  i++;
	}
	else
	{
	  neg = false;
	}
	while (i < s.length())
	{
	  final char c = s.charAt(i++);
	  if (c == '.')
	  {
		fractional = true;
	  }
	  else
	  {
		if (c < '0' || c > '9')
		{
		  throw new IllegalArgumentException("Not a decimal number " + s);
		}
		if (fractional)
		{
		  factor++;
		}

		if (base == 0)
		{
		  base = (c - '0');
		}
		else
		{
		  base = base * 10 + (c - '0');
		}
		if (DPU.isTooBigBase(base))
		{
		  throw new NumberFormatException("Too long number " + s);
		}
	  }
	}
	return getInstance(neg ? -base : base, factor);
  }