トップ 差分 一覧 ping ソース 検索 ヘルプ PDF 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;
}



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto

Copyright© 矢木 浩人 All Rights Reserved.