- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!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;
}