3

amount以下に示すように、ゲッターを介してオブジェクトで名前が付けられた値を取得しています。

hオブジェクトがそのときだとしましょう

h.getAmount()

ここで、整数型である必要があることを検証するバリデーターを開発する必要があります。amountそうでない場合は例外をスローします。以下に示すように開発しました

private  boolean isint (String amount){
    boolean isValid = true;
    try {
        Integer.parseInt(amount); 
    }
    catch(NumberFormatException e){
        isValid = false;
    }
     return isValid;
}

ここでの問題は、amountfromhが のような整数ですが、 のよう1234な浮動小数点数になることもあります1258.26。したがって、float の場合はNumberFormatException.

整数であるか浮動小数点数であるかにかかわらず、どのようにすれば両方の値に完全に対応できますか?

4

5 に答える 5

3

次のように使用できますregex:-

if (str.matches("[-+]?[0-9]*\\.?[0-9]+")) { // You can use the `\\d` instead of `0-9` too!
    // Is a number - int, float, double         
}

[-+]? - サインのために。

[0-9]*\.?[0-9]+ - 数字と数字の間の小数点。

アップデート:-

指数も処理する必要がある場合は、以下regexを使用できます。

String regex = "[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?";
于 2013-05-06T08:11:12.947 に答える
3

まず第一に、呼び出された関数がある場合は、isIntまさにそれを行う必要があります-それが整数かどうかを確認してください。それ以上でもそれ以下でもありません。

あなたはそのようなことを試すことができます

enum VarType {
    INTEGER, FLOAT, STRING, EMPTY
}

private VarType getVarType(String amount){
     if (amount.length() ==0) {
       return VarType.EMPTY;
     }
     if (amount.contains(".")) { 
       try {
         Float.parseFloat(amount); 
       }
       catch(NumberFormatException e){
         return ValType.STRING;
       }
       return ValType.FLOAT;
     } else {
       try {
         Integer.parseInt(amount); 
       }
       catch(NumberFormatException e){
         return ValType.STRING;
       }
       return ValType.INTEGER;
     }
}

ただし、この方法で例外を使用すると非常にコストがかかるため、お勧めしません。例外は、その名前が示すように、標準的なフローとしてではなく、特殊なケースや例外を処理するために使用する必要があります。

私は次のようにします:

public class ParseVarTest {

    static enum VarType {
        INTEGER, FLOAT, STRING, EMPTY
    }

    private static VarType getVarType(String amount){
        boolean onlyDigits = true;
        int dotCount = 0;
        if (amount == null) {
            return VarType.EMPTY;
        }
        String trimmed = amount.trim();
        if (trimmed.length() == 0) {
            return VarType.EMPTY;
        }
        int a=0;
        if (trimmed.charAt(0) == '-') {
            a++;
        }
        for (int max=trimmed.length(); a<max; a++) {
            if ( trimmed.charAt(a) == '.' ) {
                dotCount++;
                if (dotCount>1) break;
            } else if ( !Character.isDigit(trimmed.charAt(a)) ) {
                onlyDigits = false;
                break;
            }  
        }

        if (onlyDigits) {
            if (dotCount ==0) {
                return VarType.INTEGER;
            } else if (dotCount ==1) {
                return VarType.FLOAT;
            } else {
                return VarType.STRING;
            }
        }
        return VarType.STRING;
    }

    public static void main(String[] args) {
        String[] vars = {"", "  ", "123", "-5123", "1234.41", "-1234.41", "-1234..41","a12312", "523sdf234sdf.123"};
        for (String var: vars) {
            System.out.print(var);
            System.out.print(": \t");
            System.out.println(getVarType(var));
        }
    }

}

このような単純なタスクにはかなり長いですが、次のとおりです。

  • 正規表現なし

  • 文字列の最大 1 回のスキャン

  • 読み取り可能 (IMO)

  • 速い

ただし、このソリューションは値の範囲を検証しません。値がJava の変数に収まらない場合でも、文字列10000000000は として認識されます。VarType.INTEGERint

于 2013-05-06T08:27:15.317 に答える
1

Double.parseDoubleを使用... (メソッドisNumberの意味をよりよく反映するためにメソッド名を に変更) ...

private  boolean isNumber (String amount){
    boolean isValid = true;
    try {
        Double.parseDouble(amount); 
    }
    catch(NumberFormatException e){
        isValid = false;
    }
     return isValid;
}

...そして...に簡略化できます

private  boolean isNumber (String amount){
    try {
        Double.parseDouble(amount);             
    }
    catch(NumberFormatException e){
        return false;            
    }
    return true;
}
于 2013-05-06T09:08:13.317 に答える
0

整数または数個の小数について話している場合は、おそらくお金または数量について話している可能性があり、BigDecimal が理想的です。 浮動小数点はあまり良くありません (丸め誤差のため)。

それ以外の場合は、二重浮動小数点値について話していることになります。

new BigDecimal( str)整数または小数を解析しますが、指数も受け入れます。たとえば、1.4E2 は 140 を意味します。

おそらく、正規表現パターンを使用して最初に検証したいと思うでしょう。

if (! str.matches( "[-+]?(\\d+)|(\\d*\\.\\d+)")) 
    throw new NumberFormatException();

このパターンは、.14159 などの先頭の数字のない 10 進数を受け入れます。これは許容されるはずです。

于 2013-05-06T09:32:34.277 に答える