2012-05-02 108 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