【发布时间】:2014-09-30 10:57:05
【问题描述】:
在我的 GWT + App Engine 项目中,我有一个函数可以将 double 格式化为 String,我需要在客户端和服务器端使用它。
由于您不能在 GWT 中使用 DecimalFormat,因此您必须在客户端使用 NumberFormat,在服务器端使用 DecimalFormat。
我有一个在电线两侧使用的类 (UnitRate) 需要使用这个函数,所以我实现了两个类:ClientUtilities 和 ServerUtilities,它们都实现了 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 拆分为UnitRate 和UnitRateDto,但我不明白这一点 - 它们永远不会存储在数据存储中,并且只会作为另一个的子实体存在。
我该如何解决这个问题? 为什么,GWT,为什么?
(我想补充一点,这是高度简化的。实际上,Utilities 界面还需要执行其他格式化操作,以及需要使用/注入的其他地方。)
【问题讨论】:
-
你尝试过这个答案stackoverflow.com/a/13828293/2564898的方法吗?
标签: java google-app-engine gwt number-formatting decimalformat