PHP - Đổi số ra chữ
Đoạn code sau giúp đổi số sang chữ trong PHP.
Cách 1:
Cách này bị giới hạn số không quá giá trị
PHP_INT_MAX
(2147483647)
<?php
/**
* Đổi chữ ra số
* version này hạn chế không conver được số trên 2 tỷ
*/
function convert_number_to_words_old($number)
{
$hyphen = ' ';
$conjunction = ' ';
$separator = ' ';
$negative = 'negative ';
$decimal = ' point ';
$dictionary = array(
0 =>
'Không',
1 => 'Một',
2 => 'Hai',
3 => 'Ba',
4 => 'Bốn',
5 => 'Năm',
6 => 'Sáu',
7 => 'Bảy',
8 => 'Tám',
9 => 'Chín',
10 => 'Mười',
11 => 'Mười một',
12 => 'Mười hai',
13 => 'Mười ba',
14 => 'Mười bốn',
15 => 'Mười năm',
16 => 'Mười sáu',
17 => 'Mười bảy',
18 => 'Mười tám',
19 => 'Mười chín',
20 => 'Hai mươi',
30 => 'Ba mươi',
40 => 'Bốn mươi',
50 => 'Năm mươi',
60 => 'Sáu mươi',
70 => 'Bảy mươi',
80 => 'Tám mươi',
90 => 'Chín mươi',
100 => 'trăm',
1000 => 'ngàn',
1000000 => 'triệu',
1000000000 => 'tỷ',
1000000000000 => 'nghìn tỷ',
1000000000000000 => 'ngàn triệu triệu',
1000000000000000000 => 'tỷ tỷ'
);
if (!is_numeric($number)) {
return false;
}
if (($number >= 0 && (int)$number < 0) || (int)$number < 0 - PHP_INT_MAX) {
// overflow
trigger_error(
'convert_number_to_words only accepts numbers between -' . PHP_INT_MAX . ' and ' . PHP_INT_MAX,
E_USER_WARNING
);
return false;
}
if ($number < 0) {
return $negative . convert_number_to_words(abs($number));
}
$string = $fraction = null;
if (strpos($number, '.') !== false) {
list($number, $fraction) = explode('.', $number);
}
switch (true) {
case $number <
21:
$string = $dictionary[$number];
break;
case $number <
100:
$tens = ((int)($number / 10)) * 10;
$units = $number % 10;
$string = $dictionary[$tens];
if ($units) {
$string .= $hyphen . $dictionary[$units];
}
break;
case $number <
1000:
$hundreds = $number / 100;
$remainder = $number % 100;
$string = $dictionary[$hundreds] . ' ' . $dictionary[100];
if ($remainder) {
$string .= $conjunction . convert_number_to_words($remainder);
}
break;
default:
$baseUnit = pow(1000, floor(log($number, 1000)));
$numBaseUnits = (int)($number / $baseUnit);
$remainder = $number % $baseUnit;
$string = convert_number_to_words($numBaseUnits) . ' ' . $dictionary[$baseUnit];
if ($remainder) {
$string .= $remainder <
100 ? $conjunction : $separator;
$string .= convert_number_to_words($remainder);
}
break;
}
if (null !== $fraction && is_numeric($fraction)) {
$string .= $decimal;
$words = array();
foreach (str_split((string)$fraction) as $number) {
$words[] = $dictionary[$number];
}
$string .= implode(' ', $words);
}
return $string;
}
?>
Cách 2:
Cách này mình modified từ source http://stackoverflow.com/questions/277569/is-there-an-easy-way-to-convert-a-number-to-a-word-in-php, chạy ổn hơn, không bị giới hạn
PHP_INT_MAX
<?php
/**
* Convert number to word
* source code modified from: http://stackoverflow.com/questions/277569/is-there-an-easy-way-to-convert-a-number-to-a-word-in-php
*/
function convert_number_to_words($number)
{
if (strpos($number, '.')) {//có phần lẻ thập phân
list($integer, $fraction) = explode(".", (string)$number);
} else { //không có phần lẻ
$integer = $number;
$fraction = NULL;
}
$output = "";
if ($integer[0] == "-") {
$output = "âm ";
$integer = ltrim($integer, "-");
} else if ($integer[0] == "+") {
$output = "dương ";
$integer = ltrim($integer, "+");
}
if ($integer[0] == "0") {
$output .= "không";
} else {
$integer = str_pad($integer, 36, "0", STR_PAD_LEFT);
$group = rtrim(chunk_split($integer, 3, " "), " ");
$groups = explode(" ", $group);
$groups2 = array();
foreach ($groups as $g) {
$groups2[] = convertThreeDigit($g[0], $g[1], $g[2]);
}
for ($z = 0; $z < count($groups2); $z++) {
if ($groups2[$z] != "") {
$output .= $groups2[$z] . convertGroup(11 - $z) . (
$z < 11
&& !array_search('', array_slice($groups2, $z + 1, -1))
&& $groups2[11] != ''
&& $groups[11][0] == '0'
? " "
: ", "
);
}
}
$output = rtrim($output, ", ");
}
if ($fraction > 0) {
$output .= " phẩy";
for ($i = 0; $i < strlen($fraction); $i++) {
$output .= " " . convertDigit($fraction[$i]);
}
}
return $output;
}
function convertGroup($index)
{
switch ($index) {
case 11:
return " decillion";
case 10:
return " nonillion";
case 9:
return " octillion";
case 8:
return " septillion";
case 7:
return " sextillion";
case 6:
return " quintrillion";
case 5:
return " nghìn triệu triệu";
case 4:
return " nghìn tỷ";
case 3:
return " tỷ";
case 2:
return " triệu";
case 1:
return " nghìn";
case 0:
return "";
}
}
function convertThreeDigit($digit1, $digit2, $digit3)
{
$buffer = "";
if ($digit1 == "0" && $digit2 == "0" && $digit3 == "0") {
return "";
}
if ($digit1 != "0") {
$buffer .= convertDigit($digit1) . " trăm";
if ($digit2 != "0" || $digit3 != "0") {
$buffer .= " ";
}
}
if ($digit2 != "0") {
$buffer .= convertTwoDigit($digit2, $digit3);
} else if ($digit3 != "0") {
$buffer .= convertDigit($digit3);
}
return $buffer;
}
function convertTwoDigit($digit1, $digit2)
{
if ($digit2 == "0") {
switch ($digit1) {
case "1":
return "mười";
case "2":
return "hai mươi";
case "3":
return "ba mươi";
case "4":
return "bốn mươi";
case "5":
return "năm mươi";
case "6":
return "sáu mươi";
case "7":
return "bảy mươi";
case "8":
return "tám mươi";
case "9":
return "chín mươi";
}
} else if ($digit1 == "1") {
switch ($digit2) {
case "1":
return "mười một";
case "2":
return "mười hai";
case "3":
return "mười ba";
case "4":
return "mười bốn";
case "5":
return "mười lăm";
case "6":
return "mười sáu";
case "7":
return "mười bảy";
case "8":
return "mười tám";
case "9":
return "mười chín";
}
} else {
$temp = convertDigit($digit2);
if ($temp == 'năm') $temp = 'lăm';
if ($temp == 'một') $temp = 'mốt';
switch ($digit1) {
case "2":
return "hai mươi $temp";
case "3":
return "ba mươi $temp";
case "4":
return "bốn mươi $temp";
case "5":
return "năm mươi $temp";
case "6":
return "sáu mươi $temp";
case "7":
return "bảy mươi $temp";
case "8":
return "tám mươi $temp";
case "9":
return "chín mươi $temp";
}
}
}
function convertDigit($digit)
{
switch ($digit) {
case "0":
return "không";
case "1":
return "một";
case "2":
return "hai";
case "3":
return "ba";
case "4":
return "bốn";
case "5":
return "năm";
case "6":
return "sáu";
case "7":
return "bảy";
case "8":
return "tám";
case "9":
return "chín";
}
}
?>
Origin post at https://archive.camratus.com/2014/05/16/php-doi-so-ra-chu/