\r
import static java.lang.String.format;\r
\r
+import java.math.BigInteger;\r
import java.util.regex.Pattern;\r
\r
public final class AsmNumberUtil\r
\r
}\r
\r
- private static final String sgnPat = "[-+]?";\r
- private static final String binPat = "(?:[01]+_)*[01]+";\r
- private static final String octPat = "(?:[0-7]+_)*[0-7]+";\r
- private static final String decPat = "(?:[0-9]+_)*[0-9]+";\r
- private static final String hexPat = "(?:[0-9a-f]+_)*[0-9a-f]+";\r
+ private static final String sgnPat = "([-+]?)";\r
+ private static final String binPat = "((?:[01]+_)*[01]+)";\r
+ private static final String octPat = "((?:[0-7]+_)*[0-7]+)";\r
+ private static final String decPat = "((?:[0-9]+_)*[0-9]+)";\r
+ private static final String hexPat = "((?:[0-9a-f]+_)*[0-9a-f]+)";\r
static final Pattern numberBin = Pattern.compile(format("%1$s0b%2$s|%1$s%2$sb", sgnPat, binPat), Pattern.CASE_INSENSITIVE);\r
static final Pattern numberOct = Pattern.compile(format("%s%sq", sgnPat, octPat), Pattern.CASE_INSENSITIVE);\r
static final Pattern numberDec = Pattern.compile(format("%s%s", sgnPat, decPat));\r
return NumberType.NONE;\r
}\r
\r
+ private static CharSequence extractSignAndDigits(NumberType type, CharSequence cs)\r
+ {\r
+ return type.numberPattern.matcher(cs).replaceAll("$1$2").replaceAll("_", "");\r
+ }\r
+\r
+ public static BigInteger valueOf(CharSequence cs)\r
+ {\r
+ NumberType type = getType(cs);\r
+ if (NumberType.NONE.equals(type))\r
+ throw new NumberFormatException();\r
+ return new BigInteger(extractSignAndDigits(type, cs).toString(), type.radix);\r
+ }\r
+\r
public enum NumberType\r
{\r
- NONE, BINARY, OCTAL, DECIMAL, HEXADECIMAL, FLOATINGPOINT\r
+ NONE(-1, null), BINARY(2, AsmNumberUtil.numberBin), OCTAL(8, AsmNumberUtil.numberOct), DECIMAL(10, AsmNumberUtil.numberDec),\r
+ HEXADECIMAL(16, AsmNumberUtil.numberHex), FLOATINGPOINT(10, AsmNumberUtil.numberFloat);\r
+\r
+ public final int radix;\r
+ private final Pattern numberPattern;\r
+\r
+ NumberType(int radix, Pattern numberPattern)\r
+ {\r
+ this.radix = radix;\r
+ this.numberPattern = numberPattern;\r
+ }\r
}\r
}\r