PHP sprintf échappant%

184

Je veux la sortie suivante: -

Sur le point de déduire 50% de 27,59 € de votre compte 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 ...car il considère le% en 50%aussi pour le remplacement. Comment y échapper?

Sandeepan Nath
la source
1
@Col. Shrapnel Ma question concerne vsprintf et non printf, je l'utilise pour la première fois et je ne pourrais pas supposer la similitude entre les deux. Cependant, la recherche escapeou escapingdans les deux php.net/printfet les php.net/vsprintfdeux n'affiche pas la réponse immédiatement. Quand je cherche, %%il montre la réponse dans php.net/printf mais je ne savais pas %%!!! Avez-vous cherché la réponse avant de voter?
Sandeepan Nath
@sandeepan: vsprintfappartient à la même famille de fonctions que printf. La documentation correcte pour trouver le format, cependant, est php.net/sprintf . Les deux pages le pointent même: "Voir sprintf () pour une description du format." N'avez-vous pas au moins cliqué dessus?
BoltClock
5
@Col. Shrapnel ok très bien, prenons php.net/sprintf, où est la réponse? Il est à mi-chemin de la page. With printf() and sprintf() functions, escape character is not backslash '\' but rather '%'.Qu'y a-t-il à voter ici? Ce n'était tout simplement pas aussi évident pour moi que pour vous. Si vous trouvez une question en double, vous pouvez mieux écrire le lien. Mais je suis sûr que beaucoup trouveront cette question utile. Mais tu n'accepteras pas ça et tu diras quand même quelque chose, je sais.
Sandeepan Nath
oh je pensais que le deuxième commentaire était par le colonel Shrapnel, désolé
Sandeepan Nath
3
SO doit avoir un indicateur pour les réponses RTFM. C'est presque comme si les gens trollaient juste pour dire aux gens de lire les documents. Il avait besoin d'aide et a posé une question, puis quelqu'un a répondu utilement et a obtenu des points pour cela. Le monde a continué et Internet a été utilisé au profit de quelqu'un. Pendant ce temps, je suis échauffé par une dispute vieille de deux ans.
rob5408

Réponses:

344

Échappez-vous à un autre %:

$stringWithVariables = 'About to deduct 50%% of %s %s from your Top-Up account.';
BoltClock
la source
22
sprintf ("SELECT * FROM ... WHERE nom LIKE '%%% s %%% s %%'", $ fnom, $ lnom); - Moche mais ça marche!
Jan Hettich
1
Cela s'applique également à Ruby
Jamie Cook
vous pouvez ajouter cette partie avec un autre "% s": sprintf ('de% s vous pouvez obtenir% s', 'quelque chose', '50% ')
Lukas Liesis
Comment y échapper si la chaîne est dynamique? Disons,sprintf('This is %s.', the_title())
budji
7
@madastrostr_replace('%', '%%', the_title())
Ivanka Todorova
3

C'est très facile.

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

Par exemple,

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

Production:

%d of 23 = 23

la source
1

Et ça:

$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 votre signe de pourcentage dans votre tableau de variables

3eighty
la source