Làm cách nào để thay đổi định dạng tiền tệ trong Magento 2?


8

Hiện tại giá hiển thị như $ 2,999,00

Tôi muốn giá hiển thị như $ 2,999,00 cho ngôn ngữ es_MX (tiếng Tây Ban Nha, Mexico) trong các trang sản phẩm , ở bất kỳ nơi nào khác định dạng tiền tệ là chính xác.

Tôi đã thử tất cả các giải pháp trong stackexchange nhưng không ai làm việc.

Ứng dụng tệp / mã / Jsp / Tiền tệ / etc / di.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Framework\Locale\Format" type="Jsp\Currency\Model\Format"/>
</config>

Ứng dụng tệp / mã / Jsp / Tiền tệ / Mô hình / Format.php

<?php
namespace Jsp\Currency\Model;

use Magento\Framework\Locale\Bundle\DataBundle;

class Format extends \Magento\Framework\Locale\Format
{
    private static $defaultNumberSet = 'latn';

    public function getPriceFormat($localeCode = null, $currencyCode = null)
    {
        $localeCode = $localeCode ?: $this->_localeResolver->getLocale();
        if ($currencyCode) {
            $currency = $this->currencyFactory->create()->load($currencyCode);
        } else {
            $currency = $this->_scopeResolver->getScope()->getCurrentCurrency();
        }

        $localeData = (new DataBundle())->get($localeCode);
        $defaultSet = $localeData['NumberElements']['default'] ?: self::$defaultNumberSet;

        $format = $localeData['NumberElements'][$defaultSet]['patterns']['currencyFormat']
            ?: ($localeData['NumberElements'][self::$defaultNumberSet]['patterns']['currencyFormat']
                ?: explode(';', $localeData['NumberPatterns'][1])[0]);

        //your main changes are gone here.....
        if($localeCode == 'es_MX'){
            $decimalSymbol = '.';
            $groupSymbol = ',';
        }else{
            $decimalSymbol = $localeData['NumberElements'][$defaultSet]['symbols']['decimal']
                ?: ($localeData['NumberElements'][self::$defaultNumberSet]['symbols']['decimal']
                    ?: $localeData['NumberElements'][0]);

            $groupSymbol = $localeData['NumberElements'][$defaultSet]['symbols']['group']
                ?: ($localeData['NumberElements'][self::$defaultNumberSet]['symbols']['group']
                    ?: $localeData['NumberElements'][1]);
        }

        $pos = strpos($format, ';');
        if ($pos !== false) {
            $format = substr($format, 0, $pos);
        }
        $format = preg_replace("/[^0\#\.,]/", "", $format);
        $totalPrecision = 0;
        $decimalPoint = strpos($format, '.');
        if ($decimalPoint !== false) {
            $totalPrecision = strlen($format) - (strrpos($format, '.') + 1);
        } else {
            $decimalPoint = strlen($format);
        }
        $requiredPrecision = $totalPrecision;
        $t = substr($format, $decimalPoint);
        $pos = strpos($t, '#');
        if ($pos !== false) {
            $requiredPrecision = strlen($t) - $pos - $totalPrecision;
        }

        if (strrpos($format, ',') !== false) {
            $group = $decimalPoint - strrpos($format, ',') - 1;
        } else {
            $group = strrpos($format, '.');
        }
        $integerRequired = strpos($format, '.') - strpos($format, '0');

        $result = [
            //TODO: change interface
            'pattern' => $currency->getOutputFormat(),
            'precision' => $totalPrecision,
            'requiredPrecision' => $requiredPrecision,
            'decimalSymbol' => $decimalSymbol,
            'groupSymbol' => $groupSymbol,
            'groupLength' => $group,
            'integerRequired' => $integerRequired,
        ];       
        return $result;
    }
}

Nhà cung cấp tệp / magento / framework / Locale / Format.php

<?php
/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Framework\Locale;

use Magento\Framework\Locale\Bundle\DataBundle;

class Format implements \Magento\Framework\Locale\FormatInterface
{
    /**
     * @var string
     */
    private static $defaultNumberSet = 'latn';

    /**
     * @var \Magento\Framework\App\ScopeResolverInterface
     */
    protected $_scopeResolver;

    /**
     * @var \Magento\Framework\Locale\ResolverInterface
     */
    protected $_localeResolver;

    /**
     * @var \Magento\Directory\Model\CurrencyFactory
     */
    protected $currencyFactory;

    /**
     * @param \Magento\Framework\App\ScopeResolverInterface $scopeResolver
     * @param ResolverInterface $localeResolver
     * @param \Magento\Directory\Model\CurrencyFactory $currencyFactory
     */
    public function __construct(
        \Magento\Framework\App\ScopeResolverInterface $scopeResolver,
        \Magento\Framework\Locale\ResolverInterface $localeResolver,
        \Magento\Directory\Model\CurrencyFactory $currencyFactory
    ) {
        $this->_scopeResolver = $scopeResolver;
        $this->_localeResolver = $localeResolver;
        $this->currencyFactory = $currencyFactory;
    }

    /**
     * Returns the first found number from an string
     * Parsing depends on given locale (grouping and decimal)
     *
     * Examples for input:
     * '  2345.4356,1234' = 23455456.1234
     * '+23,3452.123' = 233452.123
     * ' 12343 ' = 12343
     * '-9456km' = -9456
     * '0' = 0
     * '2 054,10' = 2054.1
     * '2'054.52' = 2054.52
     * '2,46 GB' = 2.46
     *
     * @param string|float|int $value
     * @return float|null
     */
    public function getNumber($value)
    {
        if ($value === null) {
            return null;
        }

        if (!is_string($value)) {
            return floatval($value);
        }

        //trim spaces and apostrophes
        $value = str_replace(['\'', ' '], '', $value);

        $separatorComa = strpos($value, ',');
        $separatorDot = strpos($value, '.');

        if ($separatorComa !== false && $separatorDot !== false) {
            if ($separatorComa > $separatorDot) {
                $value = str_replace('.', '', $value);
                $value = str_replace(',', '.', $value);
            } else {
                $value = str_replace(',', '', $value);
            }
        } elseif ($separatorComa !== false) {
            $value = str_replace(',', '.', $value);
        }

        return floatval($value);
    }

    /**
     * Functions returns array with price formatting info
     *
     * @param string $localeCode Locale code.
     * @param string $currencyCode Currency code.
     * @return array
     * @SuppressWarnings(PHPMD.NPathComplexity)
     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
     */
    public function getPriceFormat($localeCode = null, $currencyCode = null)
    {
        $localeCode = $localeCode ?: $this->_localeResolver->getLocale();
        if ($currencyCode) {
            $currency = $this->currencyFactory->create()->load($currencyCode);
        } else {
            $currency = $this->_scopeResolver->getScope()->getCurrentCurrency();
        }
        $localeData = (new DataBundle())->get($localeCode);
        $defaultSet = $localeData['NumberElements']['default'] ?: self::$defaultNumberSet;
        $format = $localeData['NumberElements'][$defaultSet]['patterns']['currencyFormat']
            ?: ($localeData['NumberElements'][self::$defaultNumberSet]['patterns']['currencyFormat']
                ?: explode(';', $localeData['NumberPatterns'][1])[0]);

        $decimalSymbol = $localeData['NumberElements'][$defaultSet]['symbols']['decimal']
            ?: ($localeData['NumberElements'][self::$defaultNumberSet]['symbols']['decimal']
                ?: $localeData['NumberElements'][0]);

        $groupSymbol = $localeData['NumberElements'][$defaultSet]['symbols']['group']
            ?: ($localeData['NumberElements'][self::$defaultNumberSet]['symbols']['group']
                ?: $localeData['NumberElements'][1]);

        $pos = strpos($format, ';');
        if ($pos !== false) {
            $format = substr($format, 0, $pos);
        }
        $format = preg_replace("/[^0\#\.,]/", "", $format);
        $totalPrecision = 0;
        $decimalPoint = strpos($format, '.');
        if ($decimalPoint !== false) {
            $totalPrecision = strlen($format) - (strrpos($format, '.') + 1);
        } else {
            $decimalPoint = strlen($format);
        }
        $requiredPrecision = $totalPrecision;
        $t = substr($format, $decimalPoint);
        $pos = strpos($t, '#');
        if ($pos !== false) {
            $requiredPrecision = strlen($t) - $pos - $totalPrecision;
        }

        if (strrpos($format, ',') !== false) {
            $group = $decimalPoint - strrpos($format, ',') - 1;
        } else {
            $group = strrpos($format, '.');
        }
        $integerRequired = strpos($format, '.') - strpos($format, '0');

        $result = [
            //TODO: change interface
            'pattern' => $currency->getOutputFormat(),
            'precision' => $totalPrecision,
            'requiredPrecision' => $requiredPrecision,
            'decimalSymbol' => $decimalSymbol,
            'groupSymbol' => $groupSymbol,
            'groupLength' => $group,
            'integerRequired' => $integerRequired,
        ];

        return $result;
    }
}

Vui lòng kiểm tra câu trả lời cập nhật và nếu bạn có bất kỳ vấn đề nào hãy cho tôi biết, Đây là mã làm việc cho vấn đề của bạn. Tôi có cùng một vấn đề sắp tới cho trang web tiếng Tây Ban Nha và giải quyết bằng cách sử dụng mã dưới đây. Cảm ơn.
Rakesh Jesadiya

Xóa các điều kiện trong mã của bạn và chỉ giữ $ binarySymbol = '.' Và $ groupSymbol = ',' xóa var và kiểm tra. Để biết thêm thông tin tôi đã giữ mã cập nhật. Xin vui lòng kiểm tra xem nó.
Rakesh Jesadiya

Vui lòng kiểm tra chức năng mô-đun tùy chỉnh của bạn có được gọi hay không, bạn có thể gỡ lỗi chức năng trên nếu mã của bạn có đến trong hàm getpriceFormat hay không. Mã nguyên nhân đang làm việc cho tôi cho cùng loại vấn đề phải đối mặt với tôi.
Rakesh Jesadiya

Tôi nhận thấy tệp Format.php mà bạn cung cấp hơi khác một chút so với tệp bạn cung cấp. Đây có thể là vấn đề? Liên quan đến việc gỡ lỗi chức năng, bạn có thể giải thích chi tiết hơn về cách tôi có thể gỡ lỗi không?
Luis Garcia

Tôi có cần thêm tệp register.php trong thư mục mô-đun của mình không?
Luis Garcia

Câu trả lời:


15

chỉ tạo mô-đun đơn giản và ghi đè mặc định tệp * Format.php **,

ứng dụng / mã / Gói / Modulename / etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Framework\Locale\Format" type="Vendor\Currency\Model\Format" />
</config>

tạo tập tin mô hình, ứng dụng / mã / Gói / Modulename / Model / Format.php

<?php
namespace Package\Modulename\Model;

use Magento\Framework\Locale\Bundle\DataBundle;

class Format extends \Magento\Framework\Locale\Format
{
    private static $defaultNumberSet = 'latn';

    public function getPriceFormat($localeCode = null, $currencyCode = null)
    {
        $localeCode = $localeCode ?: $this->_localeResolver->getLocale();
        if ($currencyCode) {
            $currency = $this->currencyFactory->create()->load($currencyCode);
        } else {
            $currency = $this->_scopeResolver->getScope()->getCurrentCurrency();
        }

        $localeData = (new DataBundle())->get($localeCode);
        $defaultSet = $localeData['NumberElements']['default'] ?: self::$defaultNumberSet;

        $format = $localeData['NumberElements'][$defaultSet]['patterns']['currencyFormat']
            ?: ($localeData['NumberElements'][self::$defaultNumberSet]['patterns']['currencyFormat']
                ?: explode(';', $localeData['NumberPatterns'][1])[0]);

        //your main changes are gone here.....
        $decimalSymbol = '.';
        $groupSymbol = ',';

        $pos = strpos($format, ';');
        if ($pos !== false) {
            $format = substr($format, 0, $pos);
        }
        $format = preg_replace("/[^0\#\.,]/", "", $format);
        $totalPrecision = 0;
        $decimalPoint = strpos($format, '.');
        if ($decimalPoint !== false) {
            $totalPrecision = strlen($format) - (strrpos($format, '.') + 1);
        } else {
            $decimalPoint = strlen($format);
        }
        $requiredPrecision = $totalPrecision;
        $t = substr($format, $decimalPoint);
        $pos = strpos($t, '#');
        if ($pos !== false) {
            $requiredPrecision = strlen($t) - $pos - $totalPrecision;
        }

        if (strrpos($format, ',') !== false) {
            $group = $decimalPoint - strrpos($format, ',') - 1;
        } else {
            $group = strrpos($format, '.');
        }
        $integerRequired = strpos($format, '.') - strpos($format, '0');

        $result = [
            //TODO: change interface
            'pattern' => $currency->getOutputFormat(),
            'precision' => $totalPrecision,
            'requiredPrecision' => $requiredPrecision,
            'decimalSymbol' => $decimalSymbol,
            'groupSymbol' => $groupSymbol,
            'groupLength' => $group,
            'integerRequired' => $integerRequired,
        ];       
        return $result;
    }
}

Cảm ơn.


Tôi đã thử giải pháp của bạn nhưng không hiệu quả. Tôi đã cập nhật câu trả lời của mình với mã di.xml mà tôi đã tạo. Tôi cũng đã tạo tệp mô hình thay đổi Tên gói và Tên mô-đun để khớp với tên thư mục của mình
Luis Garcia

Tôi đã cập nhật câu hỏi của mình với mã Format.php. Cảm ơn
Luis Garcia

Tôi đã thử ở trên, nó hoạt động cho trang sản phẩm nhưng không phải trang danh mục, tự hỏi !!!
Zinat

nó làm việc cho toàn bộ trang web. vui lòng kiểm tra có thể bạn có một số vấn đề;
Rakesh Jesadiya

@RakeshJesadiya, Nó chỉ hoạt động cho trang chi tiết sản phẩm và các giá khác như Totals, Cart, v.v. nhưng nó không hoạt động trên trang niêm yết, giỏ hàng nhỏ, giá mặt hàng giỏ hàng
Codrain Technolabs Pvt Ltd 15/03/18

3

Sử dụng mã dưới đây:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$objectManager->create('\Magento\Framework\Pricing\PriceCurrencyInterface')->format('999,00',true,0);

Chức năng định dạng như dưới đây:

public function format(
        $amount,
        $includeContainer = true,
        $precision = self::DEFAULT_PRECISION,
        $scope = null,
        $currency = null
    );

Nếu $ includeContainer = true thì giá sẽ hiển thị với span container

<span class="price">$999</span>

$precision = self::DEFAULT_PRECISIONNó sẽ hiển thị hai dấu thập phân. Sử dụng 0 nó sẽ không hiển thị dấu thập phân.


Trong tập tin nào tôi nên thêm mã này? Tôi mới đến Magento
Luis Garcia

Trong tập tin nào tôi nên thêm mã này?
Luis Garcia

3

Theo mặc định của Magento 2, định dạng giá hơi lạ đối với một số loại tiền tệ vì vậy chúng tôi cần thay đổi nó. Đây là cách để thay đổi định dạng giá.

Đây là ví dụ cho trường hợp của đồng Việt Nam. Định dạng hiển thị mặc định là 100.000,00. Sau đó, tôi đổi nó thành 100.000 (được phân tách bằng dấu phẩy không có dấu thập phân).

# vendor/magento/zendframework1/library/Zend/Locale/Data/vi.xml
<symbols numbersystem="latn">
 <decimal>.</decimal>
 <group>,</group>
</symbols>

# vendor/magento/framework/Pricing/PriceCurrencyInterface.php
const DEFAULT_PRECISION = 0

# vendor/magento/module-directory/Model/Currency.php
return $this->formatPrecision($price, 0, $options, $includeContainer, $addBrackets);

# vendor/magento/module-sales/Model/Order.php
public function formatPrice($price, $addBrackets = false)
{
    return $this->formatPricePrecision($price, 0, $addBrackets);
}

Cảm ơn thưởng thức :)


đã thử nhưng không hoạt động cho es_MX
Luis Garcia

1
  1. Chuyển từ thư mục gốc của bạn đến nhà cung cấp / magento / zendframework1 / library / Zend / Locale / Data / es_MX.xml
  2. Tìm kiếm <currencyFormat

Bạn có thể đặt định dạng như thế này:

<currencyFormat type="standard">
    <pattern draft="contributed">¤#,##0.00</pattern>
</currencyFormat>

Định dạng đó đã được đặt như thế
Luis Garcia

0

để thay đổi hoặc xóa số thập phân cho các loại tiền tệ khác nhau, bạn chỉ cần cài đặt phần mở rộng Bộ định dạng tiền tệ miễn phí từ Mageplaza tại đây liên kết:  https://www.mageplaza.com/magento-2-currency-formatter/   .

Hơn bạn có thể định cấu hình thập phân cho yêu cầu của bạn từ bảng quản trị magento -> cửa hàng-> cấu hình-> Tiện ích mở rộng Mageplaza. 

Điều này làm việc cho tôi trong cài đặt magento 2.3.3. 

Trân trọng


-1

Cách xấu để làm điều đó (nhưng nhanh hơn) là nhà cung cấp mã hóa cứng / magento / framework / Locale / Format.php

    $result = [
        //TODO: change interface
        'pattern' => $currency->getOutputFormat(),
        'precision' => $totalPrecision,
        'requiredPrecision' => $requiredPrecision,
        //'decimalSymbol' => $decimalSymbol,
        'decimalSymbol' =>'.',
        //'groupSymbol' => $groupSymbol,
        'groupSymbol' => ',',
        'groupLength' => $group,
        'integerRequired' => $integerRequired,
    ];

Nếu đó là một cách xấu, thì tại sao lại gợi ý nó? Chúng ta không bao giờ nên sửa đổi cốt lõi hoặc nhà cung cấp.
Daniel Nimmo

Cảm ơn bạn. Tôi đang tìm kiếm một giải pháp bẩn nhanh chóng vì tôi muốn sửa một trang web đang chết trong khi tôi đang làm việc trên một phiên bản mới của nó.
Hassan Al-Jeshi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.