WooCommerce удаляет лишний ноль в 3-х десятичных знаках

#php #html #wordpress #woocommerce #decimal

#php #HTML #wordpress #woocommerce #десятичный

Вопрос:

Я использую 3 десятичных знака, поэтому моя цена видится как:
«$20.000» , «$20.050» , «$20.055»

У меня есть поиск по удалению нулевых десятичных знаков, и я нашел это:

     add_filter( 'woocommerce_price_trim_zeros', 'wc_hide_trailing_zeros', 10, 1 );
function wc_hide_trailing_zeros( $trim ) {
    // set to false to show trailing zeros
    return true;
}
  

Однако, это не работает должным образом. Потому что он удаляет только .000 десятичных знаков. (от $ 20.000 до $ 20)
Кроме того, я хочу просто удалить лишний 0 после запятой из последнего десятичного сегмента.

Например; от «$ 20.000» до «$ 20.00»
от «$ 20.050» до «$ 20.05»
«$ 20.055» не изменится

Ответ №1:

Ваш приведенный выше фильтр (который возвращает true ) запускает выполнение wc_trim_zeros() функции, которая действительно удаляет нули, только если цена имеет только 0 десятичных знаков.

Что вам нужно, так это использовать вместо этого formatted_woocommerce_price хук.

Приведенный ниже фильтр удалит все конечные нули:

 add_filter('formatted_woocommerce_price', function($formatted_price, $price, $decimals, $decimal_separator) {
    // Need to trim 0s only if we have the decimal separator present.
    if (strpos($formatted_price, $decimal_separator) !== false) {
        $formatted_price = rtrim($formatted_price, '0');
        // After trimming trailing 0s, it may happen that the decimal separator will remain there trailing... just get rid of it, if it's the case.
        $formatted_price = rtrim($formatted_price, $decimal_separator);
    }
    return $formatted_price;
}, 10, 4);
  

ОБНОВЛЕНИЕ: приведенный ниже код удалит завершающий ноль, только если это 3-й и последний десятичный знак:

 add_filter('formatted_woocommerce_price', function($formatted_price, $price, $decimals, $decimal_separator) {
    // Need to trim 0s only if we have the decimal separator present.
    if (strpos($formatted_price, $decimal_separator) !== false) {
        $formatted_price = preg_replace('/^(d ' . preg_quote($decimal_separator, '/' ) . 'd{2})0$/', "$1", $formatted_price);
    }
    return $formatted_price;
}, 10, 4);
  

Отказ от ответственности: код не опробован, написан непосредственно в окне ответа.

Комментарии:

1. Да, вы правы. Третий аргумент add_filter() — это приоритет, а не количество аргументов. Я соответствующим образом обновил фрагмент кода.

2. Это составляет всего 20 долларов из 20 000 долларов, когда десятичный разделитель установлен на . (точка).

3. Сделано, но 20 000 долларов стали 20 долларами. Спасибо за $ 20.050, стало $ 20.05. Осталась только одна проблема

4. Этот хорош, но я предпочитаю $ 20,00 (десятичные знаки для просмотра)

5. Если вы хотите, чтобы отображалось 2 десятичных знака, почему вы используете 3 десятичных знака для своих цен?