2012-05-02 6 views
2

私のGWT Webアプリケーションでは、価格を保持するテキストボックスがあります。 どのようにしてその文字列をBigDecimalに変換できますか?GWTで文字列をBigDecimalに変換する

+0

私はGWTに慣れていないですが、Javaであなただけの書き込み: 'BigDecimalのBD =新しいのBigDecimal(yourString);'。 – assylias

+0

[Safe String to BigDecimal conversion]の可能な複製(http://stackoverflow.com/questions/3752578/safe-string-to-bigdecimal-conversion) – Kai

+0

DecimalFormat.setParseBigDecimal関数を使用する必要があると思いますが、 GWTで – kroiz

答えて

9

最も簡単な方法は、ValueBoxを継承する新しいテキストボックスウィジェットを作成することです。 このようにすると、手動で文字列値を変換する必要はありません。 ValueBoxはそれをすべて処理します。

BigDecimal値が入力された取得するにはあなただけ行くことができます:

BigDecimal value = myTextBox.getValue();

あなたBigDecimalBox.java

public class BigDecimalBox extends ValueBox<BigDecimal> { 
    public BigDecimalBox() { 
    super(Document.get().createTextInputElement(), BigDecimalRenderer.instance(), 
     BigDecimalParser.instance()); 
    } 
} 

次に、あなたのBigDecimalRenderer.java

public class BigDecimalRenderer extends AbstractRenderer<BigDecimal> { 
    private static BigDecimalRenderer INSTANCE; 

    public static Renderer<BigDecimal> instance() { 
    if (INSTANCE == null) { 
     INSTANCE = new BigDecimalRenderer(); 
    } 
    return INSTANCE; 
    } 

    protected BigDecimalRenderer() { 
    } 

    public String render(BigDecimal object) { 
    if (null == object) { 
     return ""; 
    } 

    return NumberFormat.getDecimalFormat().format(object); 
    } 
} 

そして、あなたのBigDecimalParser.java

package com.google.gwt.text.client; 

import com.google.gwt.i18n.client.NumberFormat; 
import com.google.gwt.text.shared.Parser; 

import java.text.ParseException; 

public class BigDecimalParser implements Parser<BigDecimal> { 

    private static BigDecimalParser INSTANCE; 

    public static Parser<BigDecimal> instance() { 
    if (INSTANCE == null) { 
     INSTANCE = new BigDecimalParser(); 
    } 
    return INSTANCE; 
    } 

    protected BigDecimalParser() { 
    } 

    public BigDecimal parse(CharSequence object) throws ParseException { 
    if ("".equals(object.toString())) { 
     return null; 
    } 

    try { 
     return new BigDecimal(object.toString()); 
    } catch (NumberFormatException e) { 
     throw new ParseException(e.getMessage(), 0); 
    } 
    } 
} 
+0

私はこの方法を試みました。問題は、 'getDecimalFormat()'が千単位の区切り文字を含む 'NumberFormat'を返すことです。 'new BigDecimal'は千単位の区切り文字を解析しません。単純な回避策ではなく、適切に丸めたり、二重に解析したりする必要はありません。 –

+0

@Boris the Spider、あなたは確かに、何千ものセパレータを出力しないか、または解析前に文字列から区切り文字を取り除くカスタムNumberFormatを使用するか、NumberFormatを使用してBigDecimalを解析します(.setParseBigDecimal(true) http://stackoverflow.com/questions/14346403/how-to-parse-a-string-number-into-a-bigdecimal – Strelok

+0

最初のオプションは 'NumberFormat'の目的を無効にします - その時点では' BigDecimal.toPlainString第二の選択肢はあらゆる種類のロケールの問題をもたらします。確かに実行可能ですが、存在するホイールを再発明するように思えます。そして、最終的なものは素晴らしいですが、これは 'com.google.gwt.i18n.client 'です。このメソッドを持たないNumberFormat'を使用してください。doubleを使用するのは最も簡単な解決策のようです - 小数点以下の桁数が必要な場合は精度が十分です。 –

1

GWT-Mathをご覧ください。

+0

私はそれを倍精度に変換し、そこからBigDecimalに変換できることがわかります。それは大丈夫でしょうか?私は途中で何かを緩めるのですか? – kroiz

+2

'String'から' BigDecimal'へ行くことができるのであれば、 'double'にキャストしたときに数値が四捨五入される可能性が減ります。 – npinti

関連する問題