239 votes

Escaping % de PHP sprintf

Je veux la sortie suivante : -

Nous sommes sur le point de déduire 50 % de 27,59 € de votre compte de recharge.

quand je fais quelque chose comme ça:-

$variablesArray[0] = '€';
$variablesArray[1] = 27.59;
$stringWithVariables = 'About to deduct 50% of %s %s from your Top-Up account.';
echo vsprintf($stringWithVariables, $variablesArray);

Mais cela me donne cette erreur vsprintf() [function.vsprintf]: Too few arguments in ... parce qu'elle considère le % sur 50% également pour le remplacement. Comment puis-je m'échapper ?

2 votes

Ma question concerne vsprintf et non printf. J'utilise cette fonction pour la première fois et je ne pouvais pas supposer la similitude entre les deux. Cependant, en cherchant escape ou escaping dans les deux php.net/printf et php.net/vsprintf Les deux n'affichent pas la réponse immédiatement. Lorsque je cherche %% il montre la réponse dans php.net/printf mais je ne savais pas pour %% ! !! Avez-vous cherché la réponse là-bas avant de downvoter ?

0 votes

@sandeepan : vsprintf appartient à la même famille de fonctions que printf . La documentation correcte pour trouver le format, cependant, est la suivante php.net/sprintf . Les deux pages y font même référence : "Voir sprintf() pour une description du format." N'avez-vous pas au moins cliqué dessus ?

6 votes

@Col. Shrapnel ok bien prenons php.net/sprintf, où est la réponse ? Elle est au milieu de la page With printf() and sprintf() functions, escape character is not backslash '\' but rather '%'. Qu'y a-t-il à décréter ici ? C'est juste que ce n'était pas aussi évident pour moi que pour vous. Si vous trouvez une question dupliquée, vous pouvez mieux écrire le lien. Mais je suis sûr que beaucoup trouveront cette question utile. Mais vous ne l'accepterez pas et vous direz quand même quelque chose, je le sais.

431voto

BoltClock Points 249668

S'en échapper avec un autre % :

$stringWithVariables = 'About to deduct 50%% of %s %s from your Top-Up account.';

27 votes

Sprintf("SELECT * FROM ... WHERE name LIKE '%%%s%%s%%'", $fname, $lname) ; -- Moche mais ça marche !

0 votes

Vous pouvez ajouter cette partie avec un autre "%s" : sprintf('from %s you can get %s', 'something', '50%')

0 votes

Comment y échapper si la chaîne est dynamique ? Disons, sprintf('This is %s.', the_title())

9voto

C'est très facile.

Mettez un autre % devant l'original % pour y échapper.

Par exemple,

$num=23;
printf("%%d of 23 = %d",$num);

Sortie :

%d of 23 = 23

7voto

Pour ajouter % dans votre chaîne de langue, il vous suffit d'ajouter double pourcentage %% au lieu d'un seul

3voto

Sinan Eldem Points 700

Cela fonctionne pour moi :

sprintf(
    '%s (Cash Discount: %%%s, Deferred Discount: %%%s)',
    $segment->name,
    $segment->discount_cash,
    $segment->discount_deferred,
)

// Gold (Cash Discount: %25, Deferred Discount: %20)

2voto

3eighty Points 51

Qu'en est-il de ceci :

$variablesArray[0] = '%';
$variablesArray[1] = '€';
$variablesArray[2] = 27.59;
$stringWithVariables = 'About to deduct 50%s of %s %s from your Top-Up account.';
echo vsprintf($stringWithVariables, $variablesArray);

Ajoutez simplement le signe de pourcentage dans votre tableau de variables

0 votes

La question était de savoir comment sprintf en échappant au %.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X