นากกายกำลังตรวจแสตมป์รหัสเงินบนกล่องพัสดุเทียบกับสมุดรายชื่อสกุลเงิน

Java Currency.getAvailableCurrencies: ตรวจรหัสเงินก่อนรับจากฟอร์ม

น้องกายEngineering

ฟอร์มชำระเงินที่รับสตริง THB/USD ตรงๆ เสี่ยงพิมพ์ผิดครับ Currency.getAvailableCurrencies() ให้ชุดสกุลเงินที่ JVM รู้จักไว้ตรวจก่อนบันทึก

WHY: กันรหัสปลอมตั้งแต่ขอบระบบ

เหมือนตรวจว่าชื่อจังหวัดอยู่ในบัญชีราชการก่อนพิมพ์บนใบเสร็จ ดีกว่าไปพังตอนแปลงเรท

HOW: validate รหัสจากผู้ใช้

import java.util.Currency;
import java.util.Locale;
import java.util.Set;
import java.util.stream.Collectors;

public class Main {
  public static void main(String[] args) {
    Set<String> codes = Currency.getAvailableCurrencies().stream()
        .map(Currency::getCurrencyCode)
        .collect(Collectors.toSet());
    assert codes.contains("THB");
    assert codes.contains("USD");
    assert !codes.contains("ZZZ");

    Currency thb = Currency.getInstance("THB");
    assert thb.getDefaultFractionDigits() == 2;
    assert thb.getDisplayName(Locale.forLanguageTag("th-TH")).length() > 0;
  }
}

ชุดนี้ขึ้นกับข้อมูล locale ใน JDK ไม่ใช่เรทรายวัน และไม่บอกว่าธนาคารรับสกุลนั้น — ใช้เป็นชั้นไวยากรณ์ แล้วไปเช็กกับผู้ให้บริการชำระเงินอีกชั้น

Recap

  • ใช้ getAvailableCurrencies ตรวจรหัส ISO คร่าวๆ
  • แยก validation ไวยากรณ์กับนโยบายรับชำระจริง
  • ทดสอบทั้งรหัสที่รู้จักและรหัสปลอม
  • แสดงชื่อสกุลเงินตาม locale ของผู้ใช้