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 ของผู้ใช้