トップ 一覧 ping 検索 ヘルプ RSS ログイン

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;
 }