java 格式化字符串编号

46scxncf  于 2023-05-15  发布在  Java
关注(0)|答案(1)|浏览(210)

这个问题是来自超级用户的migrated,因为它可以在Stack Overflow上回答。Migrated 3天前.
我有一个字符串数字,它是一个金额变量,我想用逗号格式化它,这样1,000返回1,000,1000.00返回1,000.00,1000.000也返回1,000.00,最多2位小数,但如果没有小数,那么它不应该返回任何小数:例如:1,000-> 1,000 1000.00 -> 1,000.00

eanckbw9

eanckbw91#

您可以使用多态性来实现:你可以有一个 Amount 基类,然后有两个派生类来显示带或不带逗号的值。这是一个非常基本的例子,你可以把它做得更好,找到更好的名字:

@RequiredArgsConstructor
public abstract class Amount {
    protected final BigDecimal value;

    // very lite "factory" pattern
    public static Amount of(String value) {
        if (value.contains(",")) {
            return new AmountWithComma(value);
            //ps: find better names here
        }
        return new AmountWithoutComma(value);
    }

    public BigDecimal value() {
        return value;
    }

    public abstract String display();
}

现在,派生类--你可以把它们作为内部类(或者只是打包保护类),并对项目的其余部分“隐藏”它们:

static class AmountWithComma extends Amount {
    AmountWithComma(String value) {
        super(new BigDecimal(value.replaceAll(",", "")));
    }

    @Override
    public String display() {
        return value.setScale(2).toString();
    }
}

static class AmountWithoutComma extends Amount {

    private final DecimalFormat decimalFormat = new DecimalFormat("#,##0.00");

    AmountWithoutComma(String value) {
        super(new BigDecimal(value));
    }

    @Override
    public String display() {
        return decimalFormat.format(value.doubleValue());
    }
}

现在,你可以像这样使用它:

@Test
void test() {
    assertThat(Amount.of("1,000").display())
            .isEqualTo("1,000.00");
    
    assertThat(Amount.of("1000").display())
            .isEqualTo("1000.00");
}

此外,您始终可以使用amount.value()访问器以 BigDecimal 的形式获取值,因此您可以潜在地传递此对象而不是传递String并始终解析或格式化它。

相关问题