!!!Java 数値文字列の桁数チェック(指数表現にも対応) [Java] /** * 数値の文字列表現の桁数が妥当かどうかチェック * (浮動小数点数の指数表現にも対応) * * @param value 数値の文字列表現 * @param precision 全体桁数 * @param scale 小数部桁数 * @return 妥当な場合true */ public boolean validateNumberStringScale ( String value, int precision, int scale) { if ( value == null || "".equals(value.trim())) { return false; } else { // 整数部桁数 intPart = precision - scale; String exper = "^[0-9]{0," + intPart + "}([\\\\.][0-9]{0," + scale + "}){0,1}$"; if (!value.matches(exper)) { boolean isFloatCheckOk = false; try { /* ********************* * 浮動小数点数の指数表現の場合 * (仮数部)×(基数)(指数部) * * 例 0.000001 * .net : 1E-06 * java : 1.0E-6 * * 例 1000000000000000000.000000 * .net : 1E18 * java : 1.0E18 * *********************/ if (value.matches("-{0,1}[0-9]+\\.{0,1}[0-9]*[eE]-{0,1}[0-9]+")) { String[] parts = value.split("[eE]"); //System.out.println(String.format("%f" ,Double.parseDouble(value))); // 仮数部 double significand = Double.parseDouble(parts[0]); // 基数 int fundamental = Integer.parseInt(parts[1]); // 仮数部 桁 int significandLen = (int)Math.log10(significand) + 1; int pos = fundamental + significandLen; if (pos == 0) { if (scale >= 1 && intPart >=1) { isFloatCheckOk = true; } } else if (pos < 0) { if (scale >= 1 && intPart >= Math.abs(pos)) { isFloatCheckOk = true; } } else if (pos > 0) { if (scale >= Math.abs(pos) && intPart >=1) { isFloatCheckOk = true; } } } }catch(Exception e){ isFloatCheckOk = false; } if (!isFloatCheckOk) { return false; } } } return true; }