micros données schemas.org sur le prix d'un produit

Bonjour,

je cherche une solution pour bien baliser le prix d’une fiche produit dans content=« 100.00 », en effet le prix doit y être affiché avec un point et non une virgule.
dans l’exemple de la doc:

- <span itemprop="price" content="1000.00">1,000.00</span>

intl_fonction.php est trop obscure mais c’est sûrement là qu’est la solution,quelqu’un aurait une idée? Merci beaucoup par avance

Laëtitia

Bonjour,

Je lis ce message avec un peu de retard.

Le 13/04/2021 à 16:30, Laëtitia Philippe a écrit :

Bonjour,

je cherche une solution pour bien baliser le prix d'une fiche produit dans content="100.00", en effet le prix doit y être affiché avec un point et non une virgule.

Ça veut dire que dans "content" il faut un nombre flottant avec 2 décimales, c'est ça ?

Dans ce cas là le plus simple c'est number_format : PHP: number_format - Manual

[(#PRIX*|number_format{2})]

dans l'exemple de la doc:

# <span itemprop="price"content="1000.00">1,000.00</span>

intl_fonction.php est trop obscure mais c'est sûrement là qu'est la solution,quelqu'un aurait une idée? Merci beaucoup par avance

Laëtitia

Merci pour la piste, faut tester maintenant😊

Le dim. 18 avr. 2021 à 12:22, tcharlss <tcharlss@bravecassine.com> a écrit :

Bonjour,

Je lis ce message avec un peu de retard.

Le 13/04/2021 à 16:30, Laëtitia Philippe a écrit :

Bonjour,

je cherche une solution pour bien baliser le prix d’une fiche produit
dans content=« 100.00 », en effet le prix doit y être affiché avec un
point et non une virgule.

Ça veut dire que dans « content » il faut un nombre flottant avec 2
décimales, c’est ça ?

Dans ce cas là le plus simple c’est number_format :
https://www.php.net/manual/fr/function.number-format.php

[(#PRIX*|number_format{2})]

dans l’exemple de la doc:

<span itemprop="price"content=« 1000.00 »>1,000.00

intl_fonction.php est trop obscure mais c’est sûrement là qu’est la
solution,quelqu’un aurait une idée? Merci beaucoup par avance

Laëtitia


liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Archives : https://www.mail-archive.com/spip@rezo.net/maillist.html

Infos : https://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc

Après test j’en reviens pour préciser, parce qu’en fait ce que tu me proposes Tcharlss, modifie le prix affiché/ public aussi, hors c’est uniquement le prix du « content » qui doit utiliser ce nombre flottant à 2 decimal

le prix public entre ICI doit s’afficher avec la virgule

c’est celui qui renseigne la micro donnée dans qui doit s’afficher avec un point

Je ne sais pas si c’est à faire mais voici mes fichiers:

concrètement sur ma page html:

31,00 

[tp://schema.org/Product](http://schema.org/Product)">

#TITRE

#PRIX

[(#DESCRIPTIF)] [référence: (#REFERENCE)] #FORMULAIRE_PANIER_OPTIONS{produit, #ID_PRODUIT}

je reprends le plugin intl

dans mes_options.php:

<?php /** * Formater un montant (un nombre + une devise) * * Le montant retourné respecte les règles d'affichages propres à chaque langue et devise : * nombre de décimales, virgules et/ou points, emplacement de la devise, etc. * * L'option `currency_display` permet d'avoir un format spécifique aux factures. * L'option `float_only` permet d'avoir le nombre flottant arrondi selon la devise. * * @note * Nécessite soit l'extension bcmath, soit l'extension intl. * * @example montant_formater($montant, array('currency'=>'EUR', 'locale'=>'fr-CA')) * * @see [https://github.com/commerceguys/intl/blob/master/src/Formatter/CurrencyFormatterInterface.php#L8](https://github.com/commerceguys/intl/blob/master/src/Formatter/CurrencyFormatterInterface.php#L8) * @see [https://www.php.net/manual/fr/numberformatter.formatcurrency.php](https://www.php.net/manual/fr/numberformatter.formatcurrency.php) * * @uses intl_devise_defaut * @uses intl_locale_defaut * @uses intl_devise_info * @uses intl_langue_vers_locale * @uses intl_filtrer_options_formater * @uses intl_alias_options_formater * * @param float $montant * Valeur du montant à formater * @param array $options * Tableau d'options : * - markup : (String|Boolean) pour encapsuler ou pas dans un * Défaut: true * - class : (String) nom de la classe parente pour encapsuler * Défaut : montant * - currency : (String) devise, code alphabétique à 3 lettres. * Défaut : celle configurée * - locale : (String) identifiant d'une locale (fr-CA) ou code de langue SPIP (fr_tu) * - style : (String) standard | accounting. * Défaut : standard * - use_grouping : (Bool) grouper les séparateurs. * Défaut : true * - rounding_mode : constante PHP_ROUND_ ou `none`. * Défaut : PHP_ROUND_HALF UP * - minimum_fraction_digits : (Int) * Défaut : fraction de la devise. * - maximum_fraction_digits : (Int) * Défaut : fraction de la devise. * - currency_display : (String) symbol | code | none. * Défaut : symbol * @return string|float * Retourne une chaine contenant le montant formaté avec une devise, encapsulée dans un */ function filtre_montant_formater($montant, $options = array()) { intl_loader(); // S'assurer d'avoir un nombre flottant $montant = floatval(str_replace(array(',', ' '), array('.', ''), $montant)); // Devise à utiliser $devise = (!empty($options['currency']) ? $options['currency'] : intl_devise_defaut()); // Locale à utiliser $locale = (!empty($options['locale']) ? $options['locale'] : intl_locale_defaut()); $locale = intl_langue_vers_locale($locale); // Options (celles propres au formatter + diverses) $options_defaut = array( 'locale' => $locale, 'currency_display' => 'code', // pour l'accessibilité 'markup' => true, // encapsuler ); $options = array_merge($options_defaut, is_array($options) ? $options : array()); // 1) De préférence, on utilise la librairie Intl de Commerceguys if (extension_loaded('bcmath')) { // Éviter les exceptions invalid argument. $options_formatter = intl_normaliser_options_formatter($options); $numberFormatRepository = new CommerceGuys\Intl\NumberFormat\NumberFormatRepository; $currencyRepository = new CommerceGuys\Intl\Currency\CurrencyRepository; $currencyFormatter = new CommerceGuys\Intl\Formatter\CurrencyFormatter($numberFormatRepository, $currencyRepository); $montant_formate = $currencyFormatter->format($montant, $devise, $options_formatter); // 2) Sinon on se rabat sur la librairie Intl PECL } elseif (extension_loaded('intl')) { $currencyFormatter = new NumberFormatter($locale, NumberFormatter::CURRENCY); $montant_formate = $currencyFormatter->formatCurrency($montant, $devise); // 3) En dernier recours on fait le formatage du pauvre } else { $montant_nombre = str_replace('.', ',', $montant); $montant_formate = $montant_nombre . ' ' . $devise; } // Enfin, on encapsule le tout if (!empty($options['markup'])) { $classe = (!empty($options['class']) ? $options['class'] : null); // S'assurer que le montant soit arrondi selon la devise, même si c'est en principe fait en amont $arrondi_devise = intval(intl_devise_info($devise, 'fraction')); $montant = round($montant, $arrondi_devise); $montant_formate = intl_ajouter_markup_crealouest($montant_formate, $montant, $devise, $classe); } return $montant_formate; } /** * Encapsule un montant dans des en isolant la devise, en mode BEM. * * @note * On n'encapsule pas le nombre dans un span car la devise peut être incluse dedans, * ex. : -AED123 * * @example * (sans retour ligne, là c'est pour lisibilité) * ```` * * 3,14 EUR * * ```` * * @param string $montant_formate * Montant formaté avec éventuellement la devise ou le symbole * @param float $montant * Montant sans formatage * @param string $devise * Code alphabétique à 3 lettres * @param string $classe * Classe parente à utiliser, défaut = 'montant' * @return string */ function intl_ajouter_markup_crealouest($montant_formate, $montant, $devise, $classe = '') { // Les classes BEM $classe = (!empty($classe) ? $classe : 'montant'); $classe_devise = "${classe}__devise"; $english_format_number = number_format($number, 2, '.', ''); // Markupisons $cherche_devise = '/[^\d\-\.\,\(\)\s x{00a0}]+/u'; $cherche_prix = "/[0-9]{0,9}\,[0,9]{2}/"; $symbole = intl_devise_info($devise, 'symbole'); $remplace_devise = "$symbole"; $remplace_prix = "$0"; $montant_formate = preg_replace($cherche_devise, $remplace_devise, $montant_formate); $montant_formate = preg_replace($cherche_prix, $remplace_prix, $montant_formate); $montant_formate = "" . $montant_formate . ''; return $montant_formate; } Le sam. 24 avr. 2021 à 11:51, Laëtitia Philippe <[laedansa@gmail.com](mailto:laedansa@gmail.com)> a écrit : > Merci pour la piste, faut tester maintenant😊 > > Le dim. 18 avr. 2021 à 12:22, tcharlss <[tcharlss@bravecassine.com](mailto:tcharlss@bravecassine.com)> a écrit : > > > Bonjour, > > > > Je lis ce message avec un peu de retard. > > > > Le 13/04/2021 à 16:30, Laëtitia Philippe a écrit : > > > Bonjour, > > > > > > je cherche une solution pour bien baliser le prix d'une fiche produit > > > dans content="100.00", en effet le prix doit y être affiché avec un > > > point et non une virgule. > > > > Ça veut dire que dans "content" il faut un nombre flottant avec 2 > > décimales, c'est ça ? > > > > Dans ce cas là le plus simple c'est number_format : > > [https://www.php.net/manual/fr/function.number-format.php](https://www.php.net/manual/fr/function.number-format.php) > > > > [(#PRIX*|number_format{2})] > > > > > dans l'exemple de la doc: > > > > > > # 1,000.00 > > > > > > intl_fonction.php est trop obscure mais c'est sûrement là qu'est la > > > solution,quelqu'un aurait une idée? Merci beaucoup par avance > > > > > > Laëtitia > > > > > > > > > > > > > > > > > > > _______________________________________________ > > liste spip > > [spip@rezo.net](mailto:spip@rezo.net) - désabonnement : envoyer un mail à [spip-off@rezo.net](mailto:spip-off@rezo.net) > > > > Archives : [https://www.mail-archive.com/spip@rezo.net/maillist.html](https://www.mail-archive.com/spip@rezo.net/maillist.html) > > > > Infos : [https://listes.rezo.net/mailman/listinfo/spip](https://listes.rezo.net/mailman/listinfo/spip) > > > > Documentation de SPIP : [http://www.spip.net/](http://www.spip.net/) > > > > Irc : de l'aide à toute heure : [http://spip.net/irc](http://spip.net/irc)

J’ai utilisé la solution « pressé » et ça fonctionne parfaitement :wink: Merci.
Je vais ouvrir le ticket, merci encore

Le dim. 2 mai 2021 à 16:08, tcharlss <tcharlss@bravecassine.com> a écrit :

Le 01/05/2021 à 15:03, Laëtitia Philippe a écrit :

Après test j’en reviens pour préciser, parce qu’en fait ce que tu me
proposes Tcharlss, modifie le prix affiché/ public aussi, hors c’est
uniquement le prix du « content » qui doit utiliser ce nombre flottant à
2 decimal

Ah mais je parlais juste de l’attribut « content » dans ton itemprop là,
rien de plus, dedans tu mets ce que tu veux.

Mais en fait on pourrait ajouter ces microdata directement dans le
retour de montant_formater(), on n’y avait pas pensé.
Ça se passe là exactement :
https://git.spip.net/spip-contrib-extensions/intl/src/branch/master/intl_fonctions.php#L152

Est-ce que tu pourrais ouvrir un ticket dans le dépôt du plugin, qu’on
n’oublie pas ? Merci :
https://git.spip.net/spip-contrib-extensions/intl/issues

Si c’est pressé, on attendant tu devrais pouvoir te rabattre sur des
balises : laisser la balise #PRIX s’occuper de l’affichage, et
ajouter des balise à côté pour les microdatas :

#PRIX

En théorie ça devrait le faire.