TopDev

Hàm chuyển đổi giá tiền định dạng VNĐ bằng Java

minhu 📖 8 phút đọc 💬 1 phản hồi ✎ đã sửa

Dưới đây là hàm Java để chuyển đổi số thành chuỗi định dạng tiền tệ Việt Nam (VNĐ), có phân cách hàng nghìn và thêm hậu tố “₫” hoặc “VNĐ” ở cuối:

✅ Cách 1: Sử dụng NumberFormat (đơn giản, có phân cách hàng nghìn)#

` import java.text.NumberFormat; import java.util.Locale;

public class VnCurrencyFormatter { public static String formatVND(long amount) { NumberFormat formatter = NumberFormat.getInstance(new Locale("vi", "VN")); return formatter.format(amount) + " ₫"; // hoặc dùng " VNĐ" }

public static void main(String[] args) {
    long price = 123456789;
    String formattedPrice = formatVND(price);
    System.out.println(formattedPrice);  // Kết quả: 123.456.789 ₫
}

} `



✅ Cách 2: Nếu muốn kết hợp cả kiểu BigDecimal (ví dụ khi làm việc với tiền tệ trong database)#

` import java.math.BigDecimal; import java.text.NumberFormat; import java.util.Locale;

public class VnCurrencyFormatter { public static String formatVND(BigDecimal amount) { NumberFormat formatter = NumberFormat.getInstance(new Locale("vi", "VN")); return formatter.format(amount) + " ₫"; }

public static void main(String[] args) {
    BigDecimal price = new BigDecimal("987654321.75");
    System.out.println(formatVND(price)); // Kết quả: 987.654.321,75 ₫
}

} `



✅ Mẹo thêm: Nếu muốn hiển thị dạng chữ (ví dụ: "Một triệu đồng")#

Dưới đây là hàm chuyển đổi số thành chữ tiếng Việt cho đơn vị tiền tệ VNĐ trong Java (ví dụ: 1234567 ➝ "Một triệu hai trăm ba mươi tư nghìn năm trăm sáu mươi bảy đồng").



✅ Hàm Java chuyển số thành chữ (dùng cho tiền VNĐ)#

` public class NumberToVietnameseWords {

private static final String[] DON_VI = {
    "", "nghìn", "triệu", "tỷ", "nghìn tỷ", "triệu tỷ", "tỷ tỷ"
};

private static final String[] SO = {
    "không", "một", "hai", "ba", "bốn",
    "năm", "sáu", "bảy", "tám", "chín"
};

public static String convert(long number) {
    if (number == 0) return "Không đồng";

    String result = "";
    int i = 0;

    while (number > 0) {
        int block = (int)(number % 1000);
        if (block != 0) {
            String blockText = readBlock(block);
            result = blockText + " " + DON_VI[i] + " " + result;
        }
        number /= 1000;
        i++;
    }

    result = result.trim();
    result = Character.toUpperCase(result.charAt(0)) + result.substring(1);
    return result + " đồng";
}

private static String readBlock(int number) {
    int tram = number / 100;
    int chuc = (number % 100) / 10;
    int donVi = number % 10;

    StringBuilder sb = new StringBuilder();

    if (tram > 0) {
        sb.append(SO[tram]).append(" trăm");
        if (chuc == 0 && donVi != 0) {
            sb.append(" linh");
        }
    }

    if (chuc > 0) {
        if (chuc == 1) {
            sb.append(" mười");
        } else {
            sb.append(" ").append(SO[chuc]).append(" mươi");
        }

        if (donVi == 1) {
            sb.append(" mốt");
        } else if (donVi == 5) {
            sb.append(" lăm");
        } else if (donVi != 0) {
            sb.append(" ").append(SO[donVi]);
        }
    } else if (donVi != 0) {
        sb.append(" ").append(SO[donVi]);
    }

    return sb.toString().trim();
}

// Test thử
public static void main(String[] args) {
    long[] tests = {0, 15, 105, 1115, 1234567, 1000000000L};

    for (long test : tests) {
        System.out.println(test + " => " + convert(test));
    }
}

} `



✅ Kết quả ví dụ:#

0 => Không đồng 15 => Mười lăm đồng 105 => Một trăm linh năm đồng 1115 => Một nghìn một trăm mười lăm đồng 1234567 => Một triệu hai trăm ba mươi tư nghìn năm trăm sáu mươi bảy đồng 1000000000 => Một tỷ đồng

1 phản hồi

  1. minhu #1

    Dưới đây là bản nâng cấp hoàn chỉnh của hàm Java chuyển đổi BigDecimal → chữ tiếng Việt cho tiền tệ, hỗ trợ cả phần số lẻ sau dấu phẩy (ví dụ: "đồng chẵn" hoặc "đồng và sáu mươi lăm xu").



    ✅ Mã nguồn hoàn chỉnh#

    ` import java.math.BigDecimal; import java.math.RoundingMode;

    public class VnCurrencyToWords {

    private static final String[] DON_VI = {
        "", "nghìn", "triệu", "tỷ", "nghìn tỷ", "triệu tỷ", "tỷ tỷ"
    };
    
    private static final String[] SO = {
        "không", "một", "hai", "ba", "bốn",
        "năm", "sáu", "bảy", "tám", "chín"
    };
    
    public static String convert(BigDecimal amount) {
        if (amount == null) return "";
    
        BigDecimal rounded = amount.setScale(2, RoundingMode.HALF_UP);
        long nguyen = rounded.longValue(); // phần nguyên
        int le = rounded.remainder(BigDecimal.ONE)
                        .movePointRight(2)
                        .intValue(); // phần sau dấu phẩy: 0-99
    
        StringBuilder sb = new StringBuilder();
        if (nguyen == 0) {
            sb.append("Không đồng");
        } else {
            sb.append(convertWhole(nguyen)).append(" đồng");
        }
    
        if (le > 0) {
            sb.append(" và ").append(readBlock(le)).append(" xu");
        } else {
            sb.append(" chẵn");
        }
    
        // Viết hoa chữ cái đầu
        String result = sb.toString().trim();
        return Character.toUpperCase(result.charAt(0)) + result.substring(1);
    }
    
    private static String convertWhole(long number) {
        String result = "";
        int i = 0;
    
        while (number > 0) {
            int block = (int)(number % 1000);
            if (block != 0) {
                String blockText = readBlock(block);
                result = blockText + " " + DON_VI[i] + " " + result;
            }
            number /= 1000;
            i++;
        }
    
        return result.trim();
    }
    
    private static String readBlock(int number) {
        int tram = number / 100;
        int chuc = (number % 100) / 10;
        int donVi = number % 10;
    
        StringBuilder sb = new StringBuilder();
    
        if (tram > 0) {
            sb.append(SO[tram]).append(" trăm");
            if (chuc == 0 && donVi != 0) {
                sb.append(" linh");
            }
        }
    
        if (chuc > 0) {
            if (chuc == 1) {
                sb.append(" mười");
            } else {
                sb.append(" ").append(SO[chuc]).append(" mươi");
            }
    
            if (donVi == 1) {
                sb.append(" mốt");
            } else if (donVi == 5) {
                sb.append(" lăm");
            } else if (donVi != 0) {
                sb.append(" ").append(SO[donVi]);
            }
        } else if (donVi != 0) {
            sb.append(" ").append(SO[donVi]);
        }
    
        return sb.toString().trim();
    }
    
    // Demo
    public static void main(String[] args) {
        BigDecimal[] tests = {
            new BigDecimal("0"),
            new BigDecimal("15"),
            new BigDecimal("105.50"),
            new BigDecimal("1234567.65"),
            new BigDecimal("1000000000.00"),
            new BigDecimal("1000000000.01")
        };
    
        for (BigDecimal test : tests) {
            System.out.println(test + " => " + convert(test));
        }
    }
    

    } `



    ✅ Kết quả demo:#

    0 => Không đồng chẵn 15 => Mười lăm đồng chẵn 105.50 => Một trăm linh năm đồng và năm mươi xu 1234567.65 => Một triệu hai trăm ba mươi tư nghìn năm trăm sáu mươi bảy đồng và sáu mươi lăm xu 1000000000.00 => Một tỷ đồng chẵn 1000000000.01 => Một tỷ đồng và một xu



    ✅ Gợi ý sử dụng thực tế#

    Bạn có thể tích hợp hàm convert(BigDecimal) vào hệ thống xuất hóa đơn, gửi email xác nhận thanh toán, hoặc in phiếu thu để hiển thị số tiền bằng chữ.

    Dưới đây là phiên bản hoàn chỉnh kết hợp cả hai:

    • Định dạng số tiền VNĐ có phân cách dấu chấm (₫)

    • Hiển thị bằng chữ tiếng Việt (bao gồm phần xu nếu có)

    • ✅ Dạng xuất ra như: 1.234.567 ₫ (Một triệu hai trăm ba mươi tư nghìn năm trăm sáu mươi bảy đồng chẵn)



    ✅ Mã nguồn hoàn chỉnh#

    ` import java.math.BigDecimal; import java.math.RoundingMode; import java.text.NumberFormat; import java.util.Locale;

    public class VnCurrencyFormatterWithWords {

    private static final String[] DON_VI = {
        "", "nghìn", "triệu", "tỷ", "nghìn tỷ", "triệu tỷ", "tỷ tỷ"
    };
    
    private static final String[] SO = {
        "không", "một", "hai", "ba", "bốn",
        "năm", "sáu", "bảy", "tám", "chín"
    };
    
    // ✅ Hàm chính
    public static String formatVndWithWords(BigDecimal amount) {
        String numberFormatted = NumberFormat.getInstance(new Locale("vi", "VN"))
                                             .format(amount.setScale(0, RoundingMode.DOWN)) + " ₫";
        String words = convert(amount);
        return numberFormatted + " (" + words + ")";
    }
    
    // ✅ Chuyển BigDecimal sang chữ tiếng Việt
    public static String convert(BigDecimal amount) {
        if (amount == null) return "";
    
        BigDecimal rounded = amount.setScale(2, RoundingMode.HALF_UP);
        long nguyen = rounded.longValue(); // phần nguyên
        int le = rounded.remainder(BigDecimal.ONE)
                        .movePointRight(2)
                        .intValue(); // phần sau dấu phẩy: 0-99
    
        StringBuilder sb = new StringBuilder();
        if (nguyen == 0) {
            sb.append("Không đồng");
        } else {
            sb.append(convertWhole(nguyen)).append(" đồng");
        }
    
        if (le > 0) {
            sb.append(" và ").append(readBlock(le)).append(" xu");
        } else {
            sb.append(" chẵn");
        }
    
        // Viết hoa chữ cái đầu
        String result = sb.toString().trim();
        return Character.toUpperCase(result.charAt(0)) + result.substring(1);
    }
    
    private static String convertWhole(long number) {
        String result = "";
        int i = 0;
    
        while (number > 0) {
            int block = (int)(number % 1000);
            if (block != 0) {
                String blockText = readBlock(block);
                result = blockText + " " + DON_VI[i] + " " + result;
            }
            number /= 1000;
            i++;
        }
    
        return result.trim();
    }
    
    private static String readBlock(int number) {
        int tram = number / 100;
        int chuc = (number % 100) / 10;
        int donVi = number % 10;
    
        StringBuilder sb = new StringBuilder();
    
        if (tram > 0) {
            sb.append(SO[tram]).append(" trăm");
            if (chuc == 0 && donVi != 0) {
                sb.append(" linh");
            }
        }
    
        if (chuc > 0) {
            if (chuc == 1) {
                sb.append(" mười");
            } else {
                sb.append(" ").append(SO[chuc]).append(" mươi");
            }
    
            if (donVi == 1) {
                sb.append(" mốt");
            } else if (donVi == 5) {
                sb.append(" lăm");
            } else if (donVi != 0) {
                sb.append(" ").append(SO[donVi]);
            }
        } else if (donVi != 0) {
            sb.append(" ").append(SO[donVi]);
        }
    
        return sb.toString().trim();
    }
    
    // ✅ Demo
    public static void main(String[] args) {
        BigDecimal[] tests = {
            new BigDecimal("0"),
            new BigDecimal("15"),
            new BigDecimal("105.5"),
            new BigDecimal("1234567.65"),
            new BigDecimal("1000000000.00"),
            new BigDecimal("1000000000.01")
        };
    
        for (BigDecimal test : tests) {
            System.out.println(formatVndWithWords(test));
        }
    }
    

    } `



    ✅ Kết quả mẫu:#

    0 ₫ (Không đồng chẵn) 15 ₫ (Mười lăm đồng chẵn) 105 ₫ (Một trăm linh năm đồng và năm mươi xu) 1.234.567 ₫ (Một triệu hai trăm ba mươi tư nghìn năm trăm sáu mươi bảy đồng và sáu mươi lăm xu) 1.000.000.000 ₫ (Một tỷ đồng chẵn) 1.000.000.000 ₫ (Một tỷ đồng và một xu)



    ✅ Dùng cho gì?#

    • ✅ In hóa đơn

    • ✅ Xuất file PDF biên lai

    • ✅ Giao diện xác nhận thanh toán

    • ✅ Gửi email báo giá, hợp đồng

Bài liên quan trong #Java

✓ Đã sao chép link