2017-10-27 4 views
-1

私はそれについてたくさん検索しようとしましたが、具体的な解決策にはなりませんでした。任意の "文字列"入力から "数値"データ型を決定する方法

3つの数値入力が用意されているレストサービス(Jax-RSを使用)を開発中ですが、入力ごとに実際のデータ型はコンパイル時に不明です。例えば; 「num1」は、int、long、floatまたはdoubleなどの任意の数値で、同様に「num2」および「num3」とすることができます。

@GET 
@Path("func/{num1}/{num2}/{num3}") 
public String function (@PathParam("num1") String num1, @PathParam("num2") String num2, @PathParam("num3") String num3) { 

// Determine the data type of "num1", "num2" and "num3" 
// Perform any arithmetic operation on "num1", "num2" and "num3" and return the result; 

} 

どのように計算を実行するために各入力のデータタイプを決定できますか?

現在、次のコードのように一連のWrapper.parseXXXメソッドを使用して型をチェックしていますが、このアプローチは正しくないようです。

private Boolean isByte(String s) { 
    try { 
     Byte.parseByte(s); 
     return true; 

    } catch (NumberFormatException ex) { 
     return false; 
    } 
} 
private Boolean isInt(String s) { 
    try { 
     Integer.parseInt(s); 
     return true; 

    } catch (NumberFormatException ex) { 
     return false; 
    } 
} 
private Boolean isLong(String s) { 
    try { 
     Long.parseLong(s); 
     return true; 

    } catch (NumberFormatException ex) { 
     return false; 
    } 
} 
private Boolean isStrFloat(String str) { 
    try { 
     Float.parseFloat(str); 
     return true; 

    } catch (NumberFormatException ex) { 
     return false; 
    } 
} 
private Boolean isStrDouble(String str) { 
    try { 
     Double.parseDouble(str); 
     return true; 

    } catch (NumberFormatException ex) { 
     return false; 
    } 
} 

また、すべての入力にBigInteger/BigDecimalを使用する必要がありますか?

+1

予想される数値形式でAPIを定義する必要があります。ユーザーがこれを逸脱した場合は、例外をキャッチする準備をしてください。誰かが間違った数値形式に加えてテキストを渡す可能性があることに留意してください。 –

+0

org.apache.commons.lang3.math.NumberUtils.isParsableを使用する – Viraj

+0

[もっと速い回答を得るために、どのような状況で私の質問に「緊急」や他の類似のフレーズを追加することができますか?](// meta.stackoverflow .com/q/326569) - これはボランティアに対処する理想的な方法ではなく、おそらく回答を得ることに逆効果があるということです。これをあなたの質問に追加しないでください。 – halfer

答えて

0

おそらく、可能な限り小さな番号のタイプを検出する必要はありません。ちょうどDoubleを使用すると、おそらく問題ありません。入ってくるパラメータはサイズのバイトであることを起こる場合、それは何の問題もなく解析します:

Double.parseDouble(str); 

をしかし、あなたはまた、任意の着信番号を解析するjava.text.NumberFormatを使用することができます。

Number num = NumberFormat.getInstance().parse(myNumber); 

はすべてのためのNumberformatのJavadocをチェックオプション。

0

JAX-RSを使用すると、このメソッドを強制的に数値にマッチさせることができます。

方法は次のようになります。数字は、あなたが期待するものでない場合は

@GET 
@Path("func/{num1: [0-9]+(\\.[0-9]+){0,1}}/{num2: [0-9]+(\\.[0-9]+){0,1}}/{num3: [0-9]+(\\.[0-9]+){0,1}}") 
public String function (@PathParam("num1") Double num1, @PathParam("num2") Double num2, @PathParam("num3") Double num3) { 
} 

を、その後、クライアントは、私はパラメータの種類を設定する方法404 Not Found

ノートに答えます〜Double。 JAX-RS仕様には、メソッドの引数にvalueOf(String)メソッドを持つすべての型を使用できることが記載されています。パラメータの型を強制するので、ここでDoubleに安全に変換できます。

関連する問題