Derzeit zeigt der Preis wie $ 2.999,00
Ich möchte den Preis wie 2.999,00 $ zu zeigen , für locale es_MX (spanisch, Mexiko) in den Produktseiten , anderswo das Währungsformat korrekt ist.
Ich habe alle Lösungen in Stackexchange ausprobiert, aber niemand funktioniert.
Datei 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>
Datei app / code / Jsp / Currency / Model / 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;
}
}
Dateianbieter / 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;
}
}
Antworten:
Erstelle nur ein einfaches Modul und überschreibe die Standarddatei * Format.php **.
app / code / Package / Modulename / etc / di.xml
Modelldatei erstellen, app / code / Package / Modulename / Model / Format.php
Vielen Dank.
quelle
Verwenden Sie den folgenden Code:
Formatieren Sie die Funktion wie folgt:
Wenn $ includeContainer = true ist, wird der Preis mit dem Span-Container angezeigt
$precision = self::DEFAULT_PRECISION
Es werden zwei Dezimalstellen angezeigt. Bei Verwendung von 0 wird kein Dezimalpunkt angezeigt.quelle
Standardmäßig ist das Preisformat von Magento 2 für einige Währungen etwas seltsam, daher müssen wir es ändern. Hier erfahren Sie, wie Sie das Preisformat ändern können.
Hier ist das Beispiel für den Fall des vietnamesischen Dong. Das standardmäßig angezeigte Format war 100.000,00. Dann habe ich es in 100.000 geändert (durch Komma ohne Dezimalpunkt getrennt).
Danke Viel Spaß :)
quelle
<currencyFormat
Sie können das Format folgendermaßen einstellen:
quelle
Um Dezimalstellen für verschiedene Währungen zu ändern oder zu entfernen, müssen Sie nur das kostenlose Modul Currency Formatter Extension von Mageplaza hier über den Link https://www.mageplaza.com/magento-2-currency-formatter/ installieren .
Dann können Sie die Dezimalstelle für Ihre Anforderung über das Magento Admin Panel -> Stores-> Configuration-> Mageplaza Extensions konfigurieren.
Dies funktionierte bei mir in der Installation von Magento 2.3.3.
Freundliche Grüße
quelle
Ein schlechter Weg, dies zu tun (aber schneller), ist das Hardcodieren des Anbieters / magento / framework / Locale / Format.php
quelle