Java 数値文字列の桁数チェック(指数表現にも対応)
ナビゲーションに移動
検索に移動
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;
- }
© 2006 矢木浩人