【问题标题】:GWT: how to format number on server and client (Gin/Guice)GWT:如何在服务器和客户端上格式化数字(Gin/Guice)
【发布时间】:2014-09-30 10:57:05
【问题描述】:

在我的 GWT + App Engine 项目中,我有一个函数可以将 double 格式化为 String,我需要在客户端和服务器端使用它。

由于您不能在 GWT 中使用 DecimalFormat,因此您必须在客户端使用 NumberFormat,在服务器端使用 DecimalFormat

我有一个在电线两侧使用的类 (UnitRate) 需要使用这个函数,所以我实现了两个类:ClientUtilitiesServerUtilities,它们都实现了 Utilities 接口,如所以:

public interface Utilities extends Serializable
{   
    public String formatUnitOnePlace(Double value);
}

public class ClientUtilities implements Utilities
{
    @Override
    public String formatUnitOnePlace(Double value)
    {
        NumberFormat fmt = NumberFormat.getFormat("#0.0");
        return fmt.format(value);
    }
}

public class ServerUtilities implements Utilities
{
    @Override
    public String formatUnitOnePlace(Double value)
    {
        DecimalFormat oneDigit = new DecimalFormat("#0.0");// format to 1 decimal place
        return oneDigit.format(value);
    }
}

最初的想法是使用 Gin/Guice 绑定类并将Utilities 注入到UnitRate 类中,以便根据我们所在的线路的哪一侧使用正确的实现。 UnitRate 可以是Offer(服务器端)和OfferDto(客户端)的子级,但这似乎是一种相当冗长的方法,因为需要创建UnitRate 实体手动,我管理的唯一方法是使用辅助注射。

然而,这会通过程序产生连锁反应,这意味着我越来越多的域模型具有依赖关系,因此需要由 Gin/Guice 创建,这显然不理想。

在这里查看用法:

public class UnitRate implements Serializable, HasUnitType, Comparable<HasUnitType>,     HasTotal
{
    // omitted for brevity  
    private Utilities utilities;

    @AssistedInject
    private UnitRate(@Assisted UnitType unitType, Utilities utilities)
    {
        this.unitType = unitType;
        this.price = "";
        this.utilities = utilities;
    }

    @Override
    public String getTotal()
    {
        // some calculations first...
        return utilities.formatUnitOnePlace(result);
    }
}

我不确定理想的解决方案是什么...

我可以完全不使用 DecimalFormat 和 NumberFormat 并实施某种基于数学的解决方案,但我宁愿不这样做。

我可以将UnitRate 拆分为UnitRateUnitRateDto,但我不明白这一点 - 它们永远不会存储在数据存储中,并且只会作为另一个的子实体存在。

我该如何解决这个问题? 为什么,GWT,为什么?

(我想补充一点,这是高度简化的。实际上,Utilities 界面还需要执行其他格式化操作,以及需要使用/注入的其他地方。)

【问题讨论】:

标签: java google-app-engine gwt number-formatting decimalformat


【解决方案1】:

您可以通过将@GwtIncompatible 用于您尝试检索 DecimalFormat 类的方法来使其正常工作。这通知编译器忽略此方法和/或类。查看 com.google.gwt.core.shared.GwtIncompatible 以了解有关注释工作原理的更多信息。

如果这能解决您的问题,请告诉我。

顺便说一句,这可能会解决您的问题。

@GwtIncompatible
public class ServerUtilities implements Utilities
{
    @Override
    public String formatUnitOnePlace(Double value)
    {
        DecimalFormat oneDigit = new DecimalFormat("#0.0");// format to 1 decimal place
        return oneDigit.format(value);
    }
}

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2014-11-04
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多