【问题标题】:Converting String to BigDecimal in GWT在 GWT 中将字符串转换为 BigDecimal
【发布时间】:2012-05-02 12:21:59
【问题描述】:

在我的 GWT Web 应用程序中,我有一个包含价格的文本框。 如何将该字符串转换为 BigDecimal?

【问题讨论】:

  • 我对 gwt 不熟悉,但在 Java 中你只需要写:BigDecimal bd = new BigDecimal(yourString);
  • 我认为你需要使用函数 DecimalFormat.setParseBigDecimal 但你不能在 GWT 中
  • 不是重复,因为你不能在 GWT 中这样做。

标签: java gwt bigdecimal


【解决方案1】:

最简单的方法是创建继承 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);
    }
  }
}

【讨论】:

  • 我尝试了这种方法 - 它有点工作。问题是getDecimalFormat() 返回一个包含数千个分隔符的NumberFormat。而new BigDecimal 不解析千位分隔符。似乎没有简单的解决方法,无需解析为 double 并进行适当的舍入。
  • @Boris the Spider,您当然可以使用不输出千位分隔符的自定义 NumberFormat 或在解析之前从字符串中去除分隔符,或使用 NumberFormat 解析 BigDecimal(通过 .setParseBigDecimal(真的)。看到这个问题:stackoverflow.com/questions/14346403/…
  • 第一个选项违背了NumberFormat 的目的——此时BigDecimal.toPlainString 完成了这项工作。第二种选择会带来各种各样的语言环境问题——当然可行,但似乎是在重新发明现有的轮子。最后一个会很好,但这是com.google.gwt.i18n.client.NumberFormat,它没有那种方法。使用double 似乎是最简单的解决方案 - 如果只需要几个小数位,其精度就足够了。
  • @Boris 是的,忘了这个问题是关于 GWT 的。很久以前。我认为在解析之前“清理”数字字符串没有任何问题。
  • 要“清理”增强解析方法以删除所有 LocaleInfo.getCurrentLocale().getNumberConstants().groupingSeparator() 并将所有 LocaleInfo.getCurrentLocale().getNumberConstants().decimalSeparator() 替换为 ' 。 .这涵盖了我能想到的所有语言环境。
【解决方案2】:

看看GWT-Math

【讨论】:

  • 我看到我可以将其转换为 double 并从那里转换为 BigDecimal。这样会好吗?我会在路上丢东西吗?
  • 如果您可以一步从String 转到BigDecimal,您不妨这样做,因为这会减少转换为double 时数字被四舍五入的任何机会。
猜你喜欢
  • 1970-01-01
  • 2018-11-29
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多