数値を表す文字列(java版)


【件名の説明】文字列が数値(整数と小数を含む)を表すかどうかを判断する関数を実装してください.たとえば、文字列「+100」、「5 e 2」、「−123」、「3.1416」および「−1 E−16」は数値を表します.ただし、「12 e」、「1 a 3.14」、「1.2.3」、「+−5」および「12 e+4.3」はすべてではありません.
【解題の考え方】//1.合法的な数値はA[.[B]][e|EC]または.B[e|EC]. //2.Aは整数部、Bは小数部、Cはe|Eの指数部である.純小数の場合、整数部分がない場合があります.例えば、小数.123が0.123に等しい場合は、合法です.だからA部分は必須ではありません.//3.AとCはすべて整数で、記号をつけてもいいし、つけなくてもいいです.Bは符号なし整数である.
public class Solution {
    private int inx;
    public boolean isNumeric(char[] str) {
        if(str==null || str.length==0){
            return false;
        }
        inx = 0;
        boolean flag = scanInteger(str);
        //      
        if(inx<str.length && str[inx]=='.'){
            inx = inx+1;
            flag = scanUInteger(str)||flag;     //  a,     
        }
        //      
        if(inx<str.length && (str[inx]=='e' || str[inx]=='E')){
            inx = inx+1;
            flag = flag&&scanInteger(str);
        }
        return flag&& inx>=str.length;
    }

    //       
    public boolean scanInteger(char[] str){
        if(inx<str.length &&(str[inx]=='+' || str[inx]=='-')){
            inx = inx+1;
        }
        return scanUInteger(str);
    }

    //          
    public boolean scanUInteger(char[] str){
        int inx1=inx;
        while(inx<str.length && str[inx]>='0' && str[inx]<='9'){
           inx = inx + 1;
        }
        return inx>inx1;
    }
}

a.なぜ使用しているのか、&&を使用していない理由.小数は整数部分がなくてもよく、例えば.123が0.123に等しい.小数点の後ろには233のような数字がないことができます.233.0に等しい.もちろん、小数点前後には1.123のような数字があります.
【解題構想2】//1.正規表現を用いて//2をマッチングする.これは本意ではないかもしれないが、「英雄は出典を問わず、好漢はごろつき」の原則に基づいて、ここで実現する.
public class Solution {
    public boolean isNumeric(char[] str) {
        String string = String.valueOf(str);
        return string.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?");
    }
}

【解題の考え方3】//1.システム自体の検証メカニズムを利用する.//2.この方法は解題のために解題し、使用を奨励しない
public class Solution {
    public boolean isNumeric(char[] str) {
        try {
            double re = Double.parseDouble(new String(str));
        } catch (NumberFormatException e) {
            return false;
        }
        return true;
    }
}