Actuellement, le prix indique 2,99 $.
Je veux que le prix s'affiche comme 2 999,00 $ pour les paramètres régionaux es_MX (espagnol, Mexique) dans les pages de produits , partout ailleurs, le format monétaire est correct.
J'ai essayé toutes les solutions dans stackexchange mais personne ne fonctionne.
Fichier app / code / Jsp / Currency / 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>
Application de fichier / code / Jsp / devise / modèle / 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;
}
}
Fournisseur de fichiers / 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;
}
}
Réponses:
créer un module simple et remplacer le fichier par défaut * Format.php **,
app / code / Package / Modulename / etc / di.xml
créer un fichier modèle, app / code / Package / Modulename / Model / Format.php
Merci.
la source
Utilisez le code ci-dessous:
Formater la fonction comme ci-dessous:
Si $ includeContainer = true, le prix s'affichera avec le conteneur span
$precision = self::DEFAULT_PRECISION
Il affichera deux décimales. En utilisant 0, il n'affichera pas de point décimal.la source
Par défaut de Magento 2, le format de prix est un peu étrange pour certaines devises, nous devons donc le changer. Voici comment changer le format des prix.
Voici l'exemple du cas du dong vietnamien. Le format affiché par défaut était 100 000,00. Ensuite, je l'ai changé en 100 000 (séparés par une virgule sans virgule décimale).
Merci Profitez :)
la source
<currencyFormat
Vous pouvez définir le format comme ceci:
la source
pour modifier ou supprimer des décimales pour différentes devises, il vous suffit d'installer le module gratuit Currency Formatter Extension de Mageplaza ici le lien: https://www.mageplaza.com/magento-2-currency-formatter/ .
Ensuite, vous pouvez configurer la décimale selon vos besoins à partir du panneau d'administration de magento -> stores-> configuration-> Extensions Mageplaza.
Cela a fonctionné pour moi dans l'installation de magento 2.3.3.
Meilleures salutations
la source
La mauvaise façon de le faire (mais plus rapidement) est le fournisseur de codage en dur / magento / framework / Locale / Format.php
la source