การแปลงค่าเงินบาทตัวเลขเป็นตัวหนังสือไทยใน Java

ในการพัฒนาโปรแกรม Java ในเมืองไทยนั้น บ่อยครั้งที่เราจำเป็นต้องจัดการการแสดงผลของแบบฟอร์ม(Forms) หรือ รายงาน(Reports) ซึ่งในนั้นอาจจะต้องแสดงค่าเงินเป็นตัวอักษร(ตัวหนังสือ)และนี่คือตัวอย่างครับ
package demo.currency;

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

/**
 * @author nopphanan7
 * 
 */
public final class ThaiBaht {
    
    private static final String[] SCALE_TH = { "ล้าน", "สิบ", "ร้อย", "พัน", "หมื่น", "แสน", "" };
    private static final String[] DIGIT_TH = { "ศูนย์", "หนึ่ง", "สอง", "สาม", "สี่", "ห้า", "หก", "เจ็ด", "แปด", "เก้า" };
    private static final String[] SYMBOLS_TH = { "ลบ", "บาท", "ถ้วน", "สตางค์" ,"ยี่", "เอ็ด", ",", " ", "฿"};

    private String valueText;

    // ···········Methods··············//
    public String getText(double amount) {
        BigDecimal value = new BigDecimal(amount);
        this.valueText = getThaiBaht(value);
        return this.valueText;
    }

    public String getText(float amount) {
        BigDecimal value = new BigDecimal(amount);
        this.valueText = getThaiBaht(value);
        return this.valueText;
    }

    public String getText(int amount) {
        BigDecimal value = new BigDecimal(amount);
        this.valueText = getThaiBaht(value);
        return this.valueText;
    }

    public String getText(long amount) {
        BigDecimal value = new BigDecimal(amount);
        this.valueText = getThaiBaht(value);
        return this.valueText;
    }

    public String getText(String amount) {
        //ไม่ต้องการเครื่องหมายคอมมาร์, ไม่ต้องการช่องว่าง, ไม่ต้องการตัวหนังสือ บาท, ไม่ต้องการสัญลักษณ์สกุลเงินบาท
        for (String element : SYMBOLS_TH) {
            amount = amount.replace (element, "");
        }

        BigDecimal value = new BigDecimal(amount.trim());
        this.valueText = getThaiBaht(value);
        return this.valueText;
    }

    public String getText(Number amount) {
        BigDecimal value = new BigDecimal(String.valueOf(amount));
        this.valueText = getThaiBaht(value);
        return this.valueText;
    }

    private static String getThaiBaht(BigDecimal amount) {
        StringBuilder builder = new StringBuilder();
        BigDecimal absolute = amount.abs();
        int precision = absolute.precision();
        int scale = absolute.scale();
        int rounded_precision = ((precision - scale) + 2);
        MathContext mc = new MathContext(rounded_precision,RoundingMode.HALF_UP);
        BigDecimal rounded = absolute.round(mc);
        BigDecimal[] compound = rounded.divideAndRemainder(BigDecimal.ONE);
        boolean negative_amount = (-1 == amount.compareTo(BigDecimal.ZERO));

        compound[0] = compound[0].setScale(0);
        compound[1] = compound[1].movePointRight(2);

        if (negative_amount) {
            builder.append(SYMBOLS_TH[0].toString());
        }

        builder.append(getNumberText(compound[0].toBigIntegerExact()));
        builder.append(SYMBOLS_TH[1].toString());

        if (0 == compound[1].compareTo(BigDecimal.ZERO)) {
            builder.append(SYMBOLS_TH[2].toString());
        } else {
            builder.append(getNumberText(compound[1].toBigIntegerExact()));
            builder.append(SYMBOLS_TH[3].toString());
        }
        return builder.toString();
    }

    private static String getNumberText(BigInteger number) {
        StringBuffer buffer = new StringBuffer();
        char[] digits = number.toString().toCharArray();

        for (int index = digits.length; index > 0; --index) {
            int digit = Integer.parseInt(String.valueOf(digits[digits.length
                    - index]));
            String digit_text = DIGIT_TH[digit];
            int scale_idx = ((1 < index) ? ((index - 1) % 6) : 6);

            if ((1 == scale_idx) && (2 == digit)) {
                digit_text = SYMBOLS_TH[4].toString();
            }

            if (1 == digit) {
                switch (scale_idx) {
                case 0:
                case 6:
                    buffer.append((index < digits.length) ? SYMBOLS_TH[5].toString() : digit_text);
                    break;
                case 1:
                    break;
                default:
                    buffer.append(digit_text);
                    break;
                }
            } else if (0 == digit) {
                if (0 == scale_idx) {
                    buffer.append(SCALE_TH[scale_idx]);
                }
                continue;
            } else {
                buffer.append(digit_text);
            }
            buffer.append(SCALE_TH[scale_idx]);
        }
        return buffer.toString();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // จุดทศนิยมปัดเป็นสองตำแหน่ง
        System.out.println("Negative value of -1257.5463 : " + new ThaiBaht().getText(-1257.5463));
        System.out.println("Positive value of 1234.5463 : " + new ThaiBaht().getText(1234.5463));
        System.out.println("Negative string value of -1,234.5463 : " + new ThaiBaht().getText("-1,234.5463"));
        System.out.println("Positive string value of 1,234.5463 : " + new ThaiBaht().getText("1,234.5463"));
    }

}
ผลลัพธ์ที่ได้คือ
Negative value of -1257.5463 : ลบหนึ่งพันสองร้อยห้าสิบเจ็ดบาทห้าสิบห้าสตางค์
Positive value of 1234.5463 : หนึ่งพันสองร้อยสามสิบสี่บาทห้าสิบห้าสตางค์
Negative string value of -1,234.5463 : ลบหนึ่งพันสองร้อยสามสิบสี่บาทห้าสิบห้าสตางค์
Positive string value of 1,234.5463 : หนึ่งพันสองร้อยสามสิบสี่บาทห้าสิบห้าสตางค์

About Nop

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment

1 comments:

  1. มีบั๊กครับ ถ้าเงิน 0.00 หรือ 0.01 บาท

    ReplyDelete