Chuyển giá sản phẩm từ số thành chữ viết trong WooCommerce WordPress
Tại sao phải chuyển giá sản phẩm thành dạng text (chữ viết)?
Trong đa số các website bất động sản, phần giá của từng sản phẩm đều là con số rất lớn từ vài tỉ đến vài chục tỉ. Việc hiển thị các số quá lớn như vậy khá thô và không phù hợp. Việc chuyển giá sản phẩm thành text trong WooCommerce là một giải pháp khá phù hợp trong trường hợp này.
Cách chuyển giá sản phẩm thành dạng text trong WooCommerce WordPress.
Lướt Google một hồi nhưng chưa thấy hướng dẫn chuyển giá sản phẩm thành text nào nên mình quyết định viết bài này luôn. Các bạn có thể tham khảo code sau:
function
wpvn_support_wc_custom_get_price_html
( $price, $product ) {
if ( $product->get_price()) {
$price = convert_number_to_words($product->get_price());
}
return $price;
}
add_filter( '
woocommerce_get_price_html
', '
wpvn_support_wc_custom_get_price_html
', 10, 2 );
function
convert_number_to_words
($number) {
$hyphen = ' ';
$conjunction = ' ';
$separator = ' ';
$negative = 'âm ';
$decimal = ' phẩy ';
$one = 'mốt';
$ten = 'lẻ';
$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 lă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) {
return $negative . $this->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 .= strtolower( $hyphen . ($units==1?$one:$dictionary[$units]) );
}
break;
case $number < 1000:
$hundreds = $number / 100;
$remainder = $number % 100;
$string = $dictionary[$hundreds] . ' ' . $dictionary[100];
if ($remainder) {
$string .= strtolower( $conjunction . ($remainder<10?$ten.$hyphen:null) . convert_number_to_words($remainder) );
}
break;
default:
$baseUnit = pow(1000, floor(log($number, 1000)));
$numBaseUnits = (int) ($number / $baseUnit);
$remainder = $number - ($numBaseUnits*$baseUnit);
$string = convert_number_to_words($numBaseUnits) . ' ' . $dictionary[$baseUnit];
if ($remainder) {
$string .= strtolower( $remainder < 100 ? $conjunction : $separator );
$string .= strtolower( $this->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;
}
Sau một thời gian sử dụng thì mình phát hiện hàm trên có thể chuyển đổi giá sản phẩm từ số thành chữ trong hầu hết các trường hợp. Tuy nhiên nếu giá sản phẩm không phải là các số tròn tỉ hoặc tròn triệu thì phần giá đọc sẽ khá dài (VD: 750.260.000 thì sẽ đọc thành Bảy trăm năm mươi triệu hai trăm sáu mươi nghìn).
Nâng cao
Mình sẽ cập nhật code chuyển giá sản phẩm thành text trong WooCommerce tối ưu hơn trong thời gian tới. Các bạn nhớ Follow Hoặc comment để nhận thông tin mới nhất nhé.