2

Custom Decimalの私の定義=>数値は (p,s) として表すことができます。ここで、p は精度、s はスケールであり、精度とスケールに関してすべてを記述します。小数部分が 8 桁を超える小数を格納する必要がある場合は、カスタム 10 進数を使用します。位取りの最大値は 29、精度の最大値は 30 です。数値の非小数部は最大 29 桁です。

P と S は異なる場合があります...

P= 18 S=12 と仮定 ie/ (P,S) = (18,12)

intLength = 12

小数の長さ = 18

コードの一部

String regExprCD = "^-?\\d{1,"+intLength+"}(?>\\.\\d{0,"+fractionalLength+"})?$";

                    info("regExprCD = "+regExprCD );
                    if (value.matches(regExprCD ) || value.isEmpty()){
                        Window.alert("Valid CUSTOM_DECIMAL value");
                    }else{
                        Window.alert("Valid CUSTOM_DECIMAL value");
                    }

正規表現に従ってみましたが、 「正規表現の構文エラー」ページにエラーが表示されます

^-?\\d{1,"+intLength+"}(?>\\.\\d{0,"+fractionalLength+"})?$

これは、次のケースを許可する完璧な正規表現です:

正規表現は、次のカスタム 10 進数を受け入れる必要があります。

123456789012345678

1234567.1234567890

1.123456789012

1234567890.1234567

12345678901234567。

12345。

正規表現は、次のカスタム 10 進数を受け入れてはなりません:

12345678901234567890 : 理由 P > 18 :: P は 18 を超えてはなりません

1234567.1234567890123 : 理由 s>12 : :: S は 12 を超えてはなりません

.1 または .1232 :: 無効

^-?\\d{1,"+intLength+"}(?>\\.\\d{0,"+fractionalLength+"})?$ この正規表現を使用しました。

この正規表現は、Sample Java プログラムで正常に機能します。GWT で動作しない

Web ページ (GWT で開発) でエラーをスローする ::「正規表現の構文エラー」

intLength と fractionalLength のデータ型は何ですか? int または文字列 ?

完璧な正規表現はどれ?

この問題に関するヘルプまたはガイダンスをいただければ幸いです。

4

2 に答える 2

2

次の式を試すことができます。^-?\d{0,x}(?>\.\d{0,y})?$これは、オプションのマイナスで始まり、次にx数字まで、その後にドットが続き、数字までの任意の数字に一致する必要がありyます。

xandyはあなたのintLengthandになりますfractionalLength

整数部分または小数部分を要件 (.1または1.不一致) にしたい場合は、数値区間のゼロを 1 に置き換えるだけ^-?\d{1,x}(?>\.\d{1,y})?$です。

更新

固定長の SSCCE は次のとおりです。

String expression = "^-?\\d{1,18}(?>\\.\\d{0,12})?$";

//prints true
System.out.println("12345678".matches(expression)); 

//prints true
System.out.println("1234.5678".matches(expression)); 

//prints false -> integer part too long
System.out.println("1234567890123456789.5678".matches(expression)); 

//prints false -> fraction part too long
System.out.println("1234.1234567890123".matches(expression)); 

//prints false -> integer part missing
System.out.println(".5678".matches(expression)); 
于 2012-05-07T10:49:28.380 に答える
0

試してみてください: ^[\d]{1,3}[.]{1}[\d]{1,1}|^[\d]{1,3}

public class RegexTestStrings {
    public static void main(String[] args) {
        String[] EXAMPLE_TEST = {"123", "0", "123.4", ".1", "123.", "12a", "a12"};
        int P= 4, S=1;
        for(int i = 0; i< EXAMPLE_TEST.length; i++){
            System.out.println(EXAMPLE_TEST[i]+" -- "+EXAMPLE_TEST[i].matches("^[\\d]{1,"+(P-S)+"}[.]{1}[\\d]{1,"+(S)+"}|^[\\d]{1,"+(P-1)+"}"));    
        }
    }
}

結果 :

123 -- 真
0 -- 真
123.4 -- 真
.1 -- 偽
123. -- 嘘
12a -- 偽
a12 -- 偽
于 2014-06-20T07:06:30.840 に答える