Package io.github.zazalng


package io.github.zazalng
Utilities to convert numeric amounts into Thai-language baht text with multi-language support.

This package provides a comprehensive API for converting BigDecimal monetary amounts into language-specific text describing baht (บาท) and satang (สตางค์). The conversion respects linguistic conventions for digit naming and currency formatting in the selected language.

Version 2.0.0 Features (NEW):

  • Pluggable Language Handlers: Implement LanguageHandler to add ANY language without modifying core code
  • Zero Enum Coupling: Languages no longer locked to fixed enum - unlimited extensibility
  • Built-in Handlers: ThaiLanguageHandler and EnglishLanguageHandler provided
  • Backward Compatible: v1.4.0 code works unchanged via soft compatibility builders
  • Thread-Safe Configuration: Immutable config objects for safe concurrent access

Public API

The main entry points for users are:

  • ThaiBaht - Static utility methods and instance-based fluent API for converting amounts to language-specific text
  • ThaiBahtConfig - Immutable configuration for controlling output formatting, including language handler selection, unit word inclusion, and negative prefixes
  • LanguageHandler - Interface for implementing custom language handlers
  • Language - Enum defining built-in languages (THAI, ENGLISH) - backward compat only

Internal implementation classes such as io.github.zazalng.handler are package-private and not part of the public API surface.

Usage Examples

Thai Output (Default - Using Handler)


   import java.math.BigDecimal;
   import io.github.zazalng.ThaiBaht;
   import io.github.zazalng.handler.ThaiLanguageHandler;

   // v2.0.0 recommended approach
   ThaiBahtConfig config = ThaiBahtConfig.builder(new ThaiLanguageHandler())
       .useUnit(true)
       .build();
   String text = ThaiBaht.of(new BigDecimal("1234.56"), config);
   // Returns: "หนึ่งพันสองร้อยสามสิบสี่บาทห้าสิบหกสตางค์"

   // Or use convenience one-liner (backward compatible)
   String text = ThaiBaht.of(new BigDecimal("1234.56"));
   // Returns: "หนึ่งพันสองร้อยสามสิบสี่บาทห้าสิบหกสตางค์"
 

English Output (Using Handler)


   import java.math.BigDecimal;
   import io.github.zazalng.ThaiBaht;
   import io.github.zazalng.handler.EnglishLanguageHandler;

   ThaiBahtConfig config = ThaiBahtConfig.builder(new EnglishLanguageHandler())
       .useUnit(true)
       .build();
   String text = ThaiBaht.of(new BigDecimal("1234.56"), config);
   // Returns: "One Thousand Two Hundred Thirty-Four Baht Fifty-Six Satang"
 

Custom Language Handler (v2.0.0 NEW)


   import io.github.zazalng.contracts.LanguageHandler;

   public class LaotianLanguageHandler implements LanguageHandler {
       @Override public String convert(ThaiBaht baht) { return ...// conversion logic }
       @Override public String getLanguageCode() { return "lo"; }
       @Override public String getLanguageName() { return "Laotian"; }
       @Override public String getUnitWord() { return "ກີບ"; }
       @Override public String getExactWord() { return "ເທົ່າ"; }
       @Override public String getSatangWord() { return "ແອັດ"; }
       @Override public String getNegativePrefix() { return "ລົບ"; }
   }

   // Use immediately - no core library changes!
   ThaiBahtConfig config = ThaiBahtConfig.builder(new LaotianLanguageHandler())
       .useUnit(true)
       .build();
   String text = ThaiBaht.of(new BigDecimal("1234.56"), config);
 

Backward Compatibility (v1.4.0 Code Still Works)


   import io.github.zazalng.contracts.Language;

   // v1.4.0 style - still works in v2.0.0
   ThaiBahtConfig config = ThaiBahtConfig.builder(Language.ENGLISH)
       .useUnit(true)
       .build();
   // Internally creates EnglishLanguageHandler
 

Instance-Based Fluent API


   import io.github.zazalng.ThaiBaht;
   import io.github.zazalng.handler.ThaiLanguageHandler;

   ThaiBaht converter = ThaiBaht.create(new BigDecimal("100.00"))
       .config(b -> b
           .languageHandler(new ThaiLanguageHandler())
           .useUnit(true)
       );
   String text = converter.toString();
   // Returns: "หนึ่งร้อยบาทถ้วน"
 

Custom Configuration


   ThaiBahtConfig config = ThaiBahtConfig.builder(new ThaiLanguageHandler())
       .useUnit(true)
       .setPrefix("ติดลบ")  // Custom negative prefix
       .build();
   String negative = ThaiBaht.of(new BigDecimal("-100.50"), config);
   // Returns: "ติดลบหนึ่งร้อยบาทห้าสิบสตางค์"
 

v2.0.0 Architecture Highlights

Version 2.0.0 introduces a breakthrough design: Before v2.0.0, languages were locked in the Language enum (Limited extensibility). After v2.0.0, languages implement LanguageHandler interface (Unlimited extensibility). Benefit: Add any language without modifying core code. Compatibility: Soft backward compatibility via builders - v1.4.0 code still works.

Migration from v1.4.0 to v2.0.0

No changes required! Existing code continues to work. To adopt v2.0.0 syntax:


   // Old (still works)
   ThaiBahtConfig config = ThaiBahtConfig.builder(Language.THAI).build();

   // New (recommended)
   ThaiBahtConfig config = ThaiBahtConfig.builder(new ThaiLanguageHandler()).build();
 
Since:
1.0
Version:
2.0.0
Author:
Zazalng
See Also: