2012-05-02 107 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'。而新的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

我看到我可以將它轉換爲double並從那裏轉換爲BigDecimal。那會好嗎?我有什麼方法可以解決嗎? – kroiz

+2

如果您可以一步完成從'String'到'BigDecimal',那麼您可以這麼做,因爲它可以減少數字在轉換爲double時四捨五入的機率。 – npinti