1: <?php
2: 3: 4: 5: 6: 7: 8: 9:
10:
11: namespace Kotchasan;
12:
13: 14: 15: 16: 17: 18: 19:
20: class Currency
21: {
22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
37: public static function bahtEng($thb)
38: {
39: if (preg_match('/^(\-?[0-9]+)(\.([0-9]+))/', (string) $thb, $match)) {
40: $thb = self::engFormat((int) $match[1]).' Baht';
41: if ((int) $match[3] > 0) {
42: $thb .= ' and '.self::engFormat((int) substr($match[3].'00', 0, 2)).' Satang';
43: }
44: } else {
45: $thb = self::engFormat((int) $thb).' Baht';
46: }
47: return $thb;
48: }
49:
50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64:
65: public static function bahtThai($thb)
66: {
67: if (preg_match('/(\-){0,1}([0-9]+)(\.([0-9]+))?/', (string) $thb, $match)) {
68: $thb = $match[2];
69: $ths = !empty($match[4]) ? substr($match[4].'00', 0, 2) : '';
70: $thaiNum = array('', 'หนึ่ง', 'สอง', 'สาม', 'สี่', 'ห้า', 'หก', 'เจ็ด', 'แปด', 'เก้า');
71: $unitBaht = array('บาท', 'สิบ', 'ร้อย', 'พัน', 'หมื่น', 'แสน', 'ล้าน', 'สิบ', 'ร้อย', 'พัน', 'หมื่น', 'แสน', 'ล้าน');
72: $unitSatang = array('สตางค์', 'สิบ');
73: $THB = '';
74: $j = 0;
75: for ($i = strlen($thb) - 1; $i >= 0; $i--, $j++) {
76: $num = $thb[$i];
77: $tnum = $thaiNum[$num];
78: $unit = $unitBaht[$j];
79: switch (true) {
80: case $j == 0 && $num == 1 && strlen($thb) > 1:
81: $tnum = 'เอ็ด';
82: break;
83: case $j == 1 && $num == 1:
84: $tnum = '';
85: break;
86: case $j == 1 && $num == 2:
87: $tnum = 'ยี่';
88: break;
89: case $j == 6 && $num == 1 && strlen($thb) > 7:
90: $tnum = 'เอ็ด';
91: break;
92: case $j == 7 && $num == 1:
93: $tnum = '';
94: break;
95: case $j == 7 && $num == 2:
96: $tnum = 'ยี่';
97: break;
98: case $j != 0 && $j != 6 && $num == 0:
99: $unit = '';
100: break;
101: }
102: $S = $tnum.$unit;
103: $THB = $S.$THB;
104: }
105: $THB = ($match[1] == '-' ? 'ลบ' : '').$THB;
106: if ($ths == '' || $ths == '00') {
107: $THS = 'ถ้วน';
108: } else {
109: $j = 0;
110: $THS = '';
111: for ($i = strlen($ths) - 1; $i >= 0; $i--, $j++) {
112: $num = $ths[$i];
113: $tnum = $thaiNum[$num];
114: $unit = $unitSatang[$j];
115: switch (true) {
116: case $j == 0 && $num == 1 && strlen($ths) > 1:
117: $tnum = 'เอ็ด';
118: break;
119: case $j == 1 && $num == 1:
120: $tnum = '';
121: break;
122: case $j == 1 && $num == 2:
123: $tnum = 'ยี่';
124: break;
125: case $j != 0 && $j != 6 && $num == 0:
126: $unit = '';
127: break;
128: }
129: $S = $tnum.$unit;
130: $THS = $S.$THS;
131: }
132: }
133: return $THB.$THS;
134: } else {
135: return '';
136: }
137: }
138:
139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153:
154: public static function calcVat($amount, $vat, $vat_ex = true)
155: {
156: if ($vat_ex) {
157: $result = (($vat * $amount) / 100);
158: } else {
159: $result = $amount - ($amount * (100 / (100 + $vat)));
160: }
161: return $result;
162: }
163:
164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174:
175: public static function format($amount, $digit = 2, $thousands_sep = ',', $round = true)
176: {
177: if (!$round && preg_match('/^([0-9]+)(\.[0-9]{'.$digit.','.$digit.'})[0-9]+$/', (string) $amount, $match)) {
178: return number_format(floatval($match[1].$match[2]), $digit, '.', $thousands_sep);
179: } else {
180: return number_format((float) $amount, $digit, '.', $thousands_sep);
181: }
182: }
183:
184: 185: 186: 187: 188: 189: 190:
191: private static function engFormat($number)
192: {
193: if (is_int($number) && $number < abs(pow(10, 18))) {
194: switch ($number) {
195: case $number < 0:
196: $prefix = 'negative';
197: $suffix = self::engFormat(-1 * $number);
198: $string = $prefix.' '.$suffix;
199: break;
200: case 1:
201: $string = 'one';
202: break;
203: case 2:
204: $string = 'two';
205: break;
206: case 3:
207: $string = 'three';
208: break;
209: case 4:
210: $string = 'four';
211: break;
212: case 5:
213: $string = 'five';
214: break;
215: case 6:
216: $string = 'six';
217: break;
218: case 7:
219: $string = 'seven';
220: break;
221: case 8:
222: $string = 'eight';
223: break;
224: case 9:
225: $string = 'nine';
226: break;
227: case 10:
228: $string = 'ten';
229: break;
230: case 11:
231: $string = 'eleven';
232: break;
233: case 12:
234: $string = 'twelve';
235: break;
236: case 13:
237: $string = 'thirteen';
238: break;
239: case 15:
240: $string = 'fifteen';
241: break;
242: case $number < 20:
243: $string = self::engFormat($number % 10);
244: if ($number == 18) {
245: $string .= 'een';
246: } else {
247: $string .= 'teen';
248: }
249: break;
250: case 20:
251: $string = 'twenty';
252: break;
253: case 30:
254: $string = 'thirty';
255: break;
256: case 40:
257: $string = 'forty';
258: break;
259: case 50:
260: $string = 'fifty';
261: break;
262: case 60:
263: $string = 'sixty';
264: break;
265: case 70:
266: $string = 'seventy';
267: break;
268: case 80:
269: $string = 'eighty';
270: break;
271: case 90:
272: $string = 'ninety';
273: break;
274: case $number < 100:
275: $prefix = self::engFormat($number - $number % 10);
276: $suffix = self::engFormat($number % 10);
277: $string = $prefix.'-'.$suffix;
278: break;
279: case $number < pow(10, 3):
280: $string = self::engFormat(intval(floor($number / pow(10, 2)))).' hundred';
281: if ($number % pow(10, 2)) {
282: $string .= ' and '.self::engFormat($number % pow(10, 2));
283: }
284: break;
285: case $number < pow(10, 6):
286: $string = self::engFormat(intval(floor($number / pow(10, 3)))).' thousand';
287: if ($number % pow(10, 3)) {
288: $string .= self::engFormat($number % pow(10, 3));
289: }
290: break;
291: case $number < pow(10, 9):
292: $string = self::engFormat(intval(floor($number / pow(10, 6)))).' million';
293: if ($number % pow(10, 6)) {
294: $string .= ' '.self::engFormat($number % pow(10, 6));
295: }
296: break;
297: case $number < pow(10, 12):
298: $string = self::engFormat(intval(floor($number / pow(10, 9)))).' billion';
299: if ($number % pow(10, 9)) {
300: $string .= ' '.self::engFormat($number % pow(10, 9));
301: }
302: break;
303: case $number < pow(10, 15):
304: $string = self::engFormat(intval(floor($number / pow(10, 12)))).' trillion';
305: if ($number % pow(10, 12)) {
306: $string .= ' '.self::engFormat($number % pow(10, 12));
307: }
308: break;
309: case $number < pow(10, 18):
310: $string = self::engFormat(intval(floor($number / pow(10, 15)))).' quadrillion';
311: if ($number % pow(10, 15)) {
312: $string .= ' '.self::engFormat($number % pow(10, 15));
313: }
314: break;
315: }
316: return $string;
317: } else {
318: return 'zero';
319: }
320: }
321: }
322: