gpt4 book ai didi

java - 区分用于货币的 BigDecimal 和用于百分比的 BigDecimal

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:24:34 31 4
gpt4 key购买 nike

我在整个应用程序中使用 BigDecimal 来处理金钱百分比。但是,我需要一种方法来区分两者之间的用法(为了呈现它们,即在 JTable 中)。因此,我最初的想法是编写两个行为与 BigDecimal 完全相同的类,以便我可以对它们进行 instanceof 测试。所以我写了这段代码:

DollarValue.java:

import java.math.BigDecimal;

public class DollarValue extends BigDecimal {

}

百分比值.java:

import java.math.BigDecimal;

public class PercentValue extends BigDecimal {

}

但是,为了使用构造函数 ( because they cannot be inherited ),您需要手动覆盖每个构造函数。所以,DollarValue.java 变成了一个怪物:

import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;

public class DollarValue extends BigDecimal {

public DollarValue(char[] in, int offset, int len) {
super(in, offset, len);
}
public DollarValue(char[] in, int offset, int len, MathContext mc) {
super(in, offset, len, mc);
}
public DollarValue(char[] in) {
super(in);
}
public DollarValue(char[] in, MathContext mc) {
super(in, mc);
}
public DollarValue(String val) {
super(val);
}
public DollarValue(String val, MathContext mc) {
super(val, mc);
}
public DollarValue(double val) {
super(val);
}
public DollarValue(double val, MathContext mc) {
super(val, mc);
}
public DollarValue(BigInteger val) {
super(val);
}
public DollarValue(BigInteger val, MathContext mc) {
super(val, mc);
}
public DollarValue(BigInteger unscaledVal, int scale) {
super(unscaledVal, scale);
}
public DollarValue(BigInteger unscaledVal, int scale, MathContext mc) {
super(unscaledVal, scale, mc);
}
public DollarValue(int val) {
super(val);
}
public DollarValue(int val, MathContext mc) {
super(val, mc);
}
public DollarValue(long val) {
super(val);
}
public DollarValue(long val, MathContext mc) {
super(val, mc);
}
}

但更糟糕的是,在实现中,这不起作用,因为我经常使用静态 BigDecimal 代码。举例说明:

public static void main(String[] args) {
DollarValue dollars = DollarValue.ONE;
DollarValue dollars2 = DollarValue.valueOf(25);
}

抛出错误,因为 DollarValue.ONE 实际上是一个 BigDecimal,而不是 DollarValueDollarValue#valueOf() 也返回一个 BigDecimal

所以现在我没主意了。以我试图实现的方式区分同一类的两个实现的最简单方法是什么?这似乎是一个简单的问题......

编辑:任何允许我在渲染器中自动区分两者的解决方案也都有效。例如,我需要将值提供给 JTable 并让 JTable 显示一个美元符号 $ 表示金钱或一个百分号 % 表示百分比。

最佳答案

我强烈建议使用 Joda-Money与金钱打交道的图书馆,而不是试图自己重新发明轮子。与金钱打交道是一个常见且棘手的问题。让其他人为您解决。

向您的项目添加新的依赖项总是有点令人沮丧,但是当涉及到提供明显但难以实现的好处的核心实用程序库时,这应该是一个明智的选择。其他一些重要的库是:

  • Guava - 这绝对应该成为任何现代 Java 代码库的一部分。提供的实用程序和新 Collection 品具有无可替代的值(value)。
  • Joda-Time (除非你在 Java 8 上) - 就像金钱一样,时间是一个非常棘手的数据结构来正确地表示(正如 Java 的久违的 Calendar 和相关类所证明的那样)并且 Joda-Time 提供了一个健壮且经过深思熟虑的接口(interface).

还有许多我认为值得使用的其他库,但如果您不使用这三个库,那您就真的是在犯错误。正如您所指出的,虽然在技术上“非标准”,但它们是如此普遍,以至于它们离概念上预期的 Java 开发人员工具包的一部分不远。

关于java - 区分用于货币的 BigDecimal 和用于百分比的 BigDecimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23587378/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com