NumFormatterImpl.java

package space.sunqian.fs.base.number;

import space.sunqian.annotation.Nonnull;

import java.text.NumberFormat;
import java.util.function.Supplier;

final class NumFormatterImpl implements NumFormatter {

    private final @Nonnull Supplier<? extends @Nonnull NumberFormat> format;

    NumFormatterImpl(@Nonnull Supplier<? extends @Nonnull NumberFormat> format) {
        this.format = format;
    }

    @Override
    public @Nonnull String format(@Nonnull Number num) throws NumException {
        try {
            return format.get().format(num);
        } catch (Exception e) {
            throw new NumException(e);
        }
    }

    @Override
    public <T> @Nonnull T parse(@Nonnull CharSequence numStr, @Nonnull Class<T> numType) throws NumException {
        try {
            Number num = format.get().parse(numStr.toString());
            return NumKit.toNumber(num, numType);
        } catch (Exception e) {
            throw new NumException(e);
        }
    }

    enum Common implements NumFormatter {
        INST;

        @Override
        public @Nonnull String format(@Nonnull Number num) throws NumException {
            return num.toString();
        }

        @Override
        public <T> @Nonnull T parse(@Nonnull CharSequence numStr, @Nonnull Class<T> numType) throws NumException {
            return NumKit.toNumber(numStr, numType);
        }
    }
}