ข้ามไปยังเนื้อหาหลัก

สกุลเงินและจำนวนเงิน

เรียนรู้วิธีการระบุจำนวนเงินอย่างถูกต้อง ทำความเข้าใจหน่วยสกุลเงิน และทำงานกับธุรกรรมหลายสกุลเงินใน Omise API

ภาพรวม

เมื่อทำงานกับ Omise API จำนวนเงินทั้งหมดต้องระบุในหน่วยย่อยที่สุดของสกุลเงินนั้น ๆ เพื่อความแม่นยำและหลีกเลี่ยงข้อผิดพลาดของเลขทศนิยมที่อาจเกิดขึ้นกับค่าทศนิยม

หน่วยย่อยที่สุดของสกุลเงิน

แต่ละสกุลเงินมีหน่วยย่อยที่สุด (เรียกอีกอย่างว่าหน่วยย่อย):

สกุลเงินรหัสหน่วยย่อยที่สุดตำแหน่งทศนิยมตัวอย่าง
บาทไทยTHBสตางค์2฿100.00 = 10000
เยนญี่ปุ่นJPYเยน0¥100 = 100
ดอลลาร์สิงคโปร์SGDเซนต์2S$100.00 = 10000
ริงกิตมาเลเซียMYRเซน2RM100.00 = 10000
ดอลลาร์สหรัฐUSDเซนต์2$100.00 = 10000
ยูโรEURเซนต์2€100.00 = 10000

ตัวอย่าง

// บาทไทย: ฿1,000.00 = 100,000 สตางค์
const amount = 100000;
const currency = 'thb';

// เยนญี่ปุ่น: ¥1,000 = 1,000 เยน (ไม่มีหน่วยย่อย)
const amount = 1000;
const currency = 'jpy';

// ดอลลาร์สิงคโปร์: S$50.50 = 5,050 เซนต์
const amount = 5050;
const currency = 'sgd';

ข้อผิดพลาดที่พบบ่อย

// ❌ ผิด - ใช้ค่าทศนิยม
const charge = await omise.charges.create({
amount: 1000.00, // นี่คือ ฿10.00 ไม่ใช่ ฿1,000!
currency: 'thb'
});

// ✅ ถูกต้อง - ใช้หน่วยย่อยที่สุด
const charge = await omise.charges.create({
amount: 100000, // นี่คือ ฿1,000.00
currency: 'thb'
});

การแปลงจำนวนเงิน

จำนวนเงินแสดงผลเป็นหน่วยย่อยที่สุด

function toSmallestUnit(amount, currency) {
const zeroDecimalCurrencies = ['jpy', 'krw', 'vnd'];

if (zeroDecimalCurrencies.includes(currency.toLowerCase())) {
return Math.round(amount);
}

return Math.round(amount * 100);
}

// การใช้งาน
toSmallestUnit(1000.00, 'thb'); // 100000
toSmallestUnit(1000, 'jpy'); // 1000
toSmallestUnit(99.99, 'sgd'); // 9999

หน่วยย่อยที่สุดเป็นจำนวนเงินแสดงผล

function toDisplayAmount(amount, currency) {
const zeroDecimalCurrencies = ['jpy', 'krw', 'vnd'];

if (zeroDecimalCurrencies.includes(currency.toLowerCase())) {
return amount;
}

return amount / 100;
}

// การใช้งาน
toDisplayAmount(100000, 'thb'); // 1000.00
toDisplayAmount(1000, 'jpy'); // 1000
toDisplayAmount(9999, 'sgd'); // 99.99

การจัดรูปแบบเพื่อแสดงผล

function formatCurrency(amount, currency) {
const displayAmount = toDisplayAmount(amount, currency);

return new Intl.NumberFormat('en-US', {
style: 'currency',
currency: currency.toUpperCase()
}).format(displayAmount);
}

// การใช้งาน
formatCurrency(100000, 'thb'); // "฿1,000.00"
formatCurrency(1000, 'jpy'); // "¥1,000"
formatCurrency(9999, 'sgd'); // "S$99.99"

สกุลเงินที่รองรับ

การเรียกเก็บเงิน (บัตรเครดิต/เดบิต)

สกุลเงินที่ใช้ได้สำหรับการเรียกเก็บเงินขึ้นอยู่กับประเทศที่ลงทะเบียนบัญชีของคุณ:

ประเทศสกุลเงินที่รองรับ
ไทยTHB
ญี่ปุ่นJPY
สิงคโปร์SGD, USD
มาเลเซียMYR

ขีดจำกัดการเรียกเก็บเงิน

ประเทศสกุลเงินขั้นต่ำสูงสุด
ไทยTHB฿20 (2000)฿150,000 (15000000)
ญี่ปุ่นJPY¥100 (100)¥6,000,000 (6000000)
สิงคโปร์SGDS$1 (100)S$99,999 (9999900)
มาเลเซียMYRRM1 (100)RM30,000 (3000000)

การโอนเงิน

ประเทศสกุลเงินขั้นต่ำสูงสุด
ไทยTHB฿30 (3000)฿2,000,000 (200000000)
ญี่ปุ่นJPY¥1 (1)¥10,000,000 (10000000)
สิงคโปร์SGDS$1 (100)S$200,000 (20000000)
มาเลเซียMYRRM1 (100)RM500,000 (50000000)

สกุลเงินที่ใช้ชำระบัญชี

การเรียกเก็บเงินจะถูกชำระบัญชีเป็นสกุลเงินทุนของบัญชีของคุณเสมอ ซึ่งกำหนดโดยประเทศที่ลงทะเบียนบัญชีของคุณ:

ประเทศของบัญชีสกุลเงินที่ใช้ชำระบัญชี
ไทยTHB (บาทไทย)
ญี่ปุ่นJPY (เยนญี่ปุ่น)
สิงคโปร์SGD (ดอลลาร์สิงคโปร์)
มาเลเซียMYR (ริงกิตมาเลเซีย)
การเรียกเก็บเงินหลายสกุลเงิน

หากคุณรับชำระเงินในสกุลเงินที่แตกต่างจากสกุลเงินที่ใช้ชำระบัญชีของคุณ Omise จะแปลงจำนวนเงินโดยอัตโนมัติตามอัตราแลกเปลี่ยนปัจจุบัน

สกุลเงินที่ไม่มีทศนิยม

สกุลเงินบางสกุลไม่มีหน่วยเศษส่วน สำหรับสกุลเงินเหล่านี้ ค่าจำนวนเงินจะแทนหน่วยสกุลเงินเต็ม:

สกุลเงินรหัสตัวอย่าง
เยนญี่ปุ่นJPY¥500 = 500
วอนเกาหลีKRW₩500 = 500
ดองเวียดนามVND₫500 = 500

ตัวอย่าง API

การสร้างการเรียกเก็บเงิน

curl https://api.omise.co/charges \
-u skey_test_YOUR_SECRET_KEY: \
-d "amount=100000" \
-d "currency=thb" \
-d "card=tokn_test_xxx"

นี่จะเรียกเก็บเงิน ฿1,000.00 (100,000 สตางค์)

การสร้างการโอนเงิน

curl https://api.omise.co/transfers \
-u skey_test_YOUR_SECRET_KEY: \
-d "amount=500000" \
-d "recipient=recp_test_xxx"

นี่จะโอนเงิน ฿5,000.00 (500,000 สตางค์) ไปยังผู้รับ

การสร้างการคืนเงิน

curl https://api.omise.co/charges/chrg_test_xxx/refunds \
-u skey_test_YOUR_SECRET_KEY: \
-d "amount=50000"

นี่จะคืนเงิน ฿500.00 (50,000 สตางค์) จากการเรียกเก็บเงิน

การปัดเศษ

เมื่อทำการคำนวณที่อาจได้ผลลัพธ์เป็นหน่วยย่อยที่สุดแบบเศษส่วน ให้ปัดเศษเป็นจำนวนเต็มที่ใกล้เคียงที่สุดเสมอ:

// คำนวณส่วนลด 10% จาก ฿999.00
const originalAmount = 99900; // ฿999.00 ในหน่วยสตางค์
const discount = 0.10;
const discountAmount = Math.round(originalAmount * discount); // 9990 สตางค์ (฿99.90)
const finalAmount = originalAmount - discountAmount; // 89910 สตางค์ (฿899.10)
หลีกเลี่ยงเลขทศนิยมลอยตัว

อย่าใช้การคำนวณเลขทศนิยมลอยตัวสำหรับการคำนวณสกุลเงิน ใช้จำนวนเต็ม (หน่วยย่อยที่สุด) และปัดเศษอย่างเหมาะสมเสมอ

คำถามที่พบบ่อย

ทำไมต้องใช้หน่วยย่อยที่สุดของสกุลเงินแทนจำนวนเงินทศนิยม?

การใช้หน่วยย่อยที่สุดของสกุลเงิน (จำนวนเต็ม) ป้องกันข้อผิดพลาดความแม่นยำของเลขทศนิยมลอยตัวที่อาจเกิดขึ้นกับการคำนวณทศนิยม ตัวอย่างเช่น:

// ปัญหาเลขทศนิยมลอยตัว
0.1 + 0.2 === 0.3 // false! (0.30000000000000004)

// การคำนวณด้วยจำนวนเต็ม (ไม่มีปัญหา)
10 + 20 === 30 // true

การทำงานกับจำนวนเต็มช่วยให้การคำนวณทางการเงินถูกต้องแม่นยำ

จะจัดการการแปลงสกุลเงินอย่างไร?

Omise จัดการการแปลงสกุลเงินโดยอัตโนมัติสำหรับบัญชีหลายสกุลเงิน เมื่อมีการเรียกเก็บเงินในสกุลเงินที่แตกต่างจากสกุลเงินที่ใช้ชำระบัญชีของคุณ ระบบจะแปลงตามอัตราแลกเปลี่ยนปัจจุบัน อัตราการแปลงจะรวมอยู่ในการตอบกลับของการเรียกเก็บเงิน:

{
"object": "charge",
"amount": 10000,
"currency": "usd",
"funding_amount": 350000,
"funding_currency": "thb",
"exchange_rate": 35.0
}
จะเกิดอะไรขึ้นถ้าส่งรูปแบบจำนวนเงินที่ไม่ถูกต้อง?

API คาดหวังค่าจำนวนเต็ม หากคุณส่งค่าทศนิยม ค่าจะถูกตัดทอน:

  • การส่ง 1000.50 จะกลายเป็น 1000 (.50 จะหายไป)
  • นี่จะเรียกเก็บเงิน ฿10.00 แทนที่จะเป็น ฿1,000.50

ตรวจสอบจำนวนเงินก่อนส่งไปยัง API เสมอ

สามารถเรียกเก็บเงินบางส่วนได้หรือไม่ (เช่น ฿10.25)?

ได้ แต่คุณต้องระบุจำนวนเงินในหน่วยสตางค์:

  • ฿10.25 = 1025 สตางค์
  • ฿99.99 = 9999 สตางค์

จำนวนเงินขั้นต่ำที่สามารถเรียกเก็บได้แตกต่างกันตามสกุลเงินและโดยทั่วไปจะเทียบเท่ากับขีดจำกัดการเรียกเก็บเงินขั้นต่ำ

จะแสดงจำนวนเงินให้ลูกค้าอย่างไร?

แปลงหน่วยย่อยที่สุดกลับเป็นรูปแบบแสดงผล:

const amountInSatangs = 99999;
const displayAmount = (amountInSatangs / 100).toFixed(2); // "999.99"
const formatted = `฿${displayAmount}`; // "฿999.99"

หรือใช้ Intl.NumberFormat สำหรับการจัดรูปแบบที่เหมาะสมกับภาษาท้องถิ่น

มีสกุลเงินที่มี 3 ตำแหน่งทศนิยมหรือไม่?

สกุลเงินบางสกุล เช่น KWD (ดีนาร์คูเวต), BHD (ดีนาร์บาห์เรน) และ OMR (เรียลโอมาน) ใช้ 3 ตำแหน่งทศนิยม (ฟิลส์) อย่างไรก็ตาม สกุลเงินเหล่านี้ยังไม่รองรับโดย Omise ในปัจจุบัน สกุลเงินที่รองรับทั้งหมดใช้ 0 หรือ 2 ตำแหน่งทศนิยม

แหล่งข้อมูลที่เกี่ยวข้อง