PHP sprintf escapando%

184

Quiero el siguiente resultado: -

A punto de deducir el 50% de € 27.59 de su cuenta de Top-Up.

cuando hago algo como esto:

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

Pero me da este error vsprintf() [function.vsprintf]: Too few arguments in ...porque considera que el %de 50%también para su sustitución. ¿Cómo me escapo?

Sandeepan Nath
fuente
1
@Columna. Metralla Mi pregunta es sobre vsprintf, no printf, estoy usando esto por primera vez y no puedo asumir la similitud entre los dos. Sin embargo, buscar escapeo escapingen ambos php.net/printfy en php.net/vsprintfambos no muestra la respuesta de inmediato. Cuando busco %%que muestra la respuesta en php.net/printf pero yo no sabía nada %%!!! ¿Buscó la respuesta allí antes de votar?
Sandeepan Nath
@sandeepan: vsprintfpertenece a la misma familia de funciones que printf. Sin embargo, la documentación correcta para encontrar el formato es php.net/sprintf . Ambas páginas incluso lo señalan: "Ver sprintf () para una descripción del formato". ¿Al menos no lo hiciste clic?
BoltClock
55
@Columna. Metralla ok bien, tomemos php.net/sprintf, ¿dónde está la respuesta? Está a la mitad de la página With printf() and sprintf() functions, escape character is not backslash '\' but rather '%'.¿Qué hay para votar abajo aquí? Simplemente no era tan obvio para mí como lo fue para ti. Si encuentra una pregunta duplicada, puede escribir mejor el enlace. Pero estoy seguro de que muchos encontrarán útil esta pregunta. Pero no aceptará eso y aún dirá algo, lo sé.
Sandeepan Nath
oh, pensé que el segundo comentario era del coronel Metralla, lo siento
Sandeepan Nath
3
SO debería tener una bandera para las respuestas RTFM. Es casi como la gente troll solo para que puedan decirle a la gente que lea los documentos. Necesitaba ayuda e hizo una pregunta y luego alguien respondió con ayuda y obtuvo puntos por ello. El mundo continuó e Internet se usó para el beneficio de alguien. Mientras tanto, me estoy calentando por una discusión de dos años.
rob5408

Respuestas:

344

Escápelo con otro %:

$stringWithVariables = 'About to deduct 50%% of %s %s from your Top-Up account.';
BoltClock
fuente
22
sprintf ("SELECT * FROM ... WHERE name LIKE '%%% s %%% s %%'", $ fname, $ lname); - Feo pero funciona!
Jan Hettich
1
Esto también se aplica a Ruby
Jamie Cook el
puedes agregar esa parte con otro "% s": sprintf ('de% s puedes obtener% s', 'algo', '50% ')
Lukas Liesis
¿Cómo se escapa si la cadena es dinámica? Digamos Vamos,sprintf('This is %s.', the_title())
budji
77
@madastrostr_replace('%', '%%', the_title())
Ivanka Todorova
3

Es muy fácil.

Pon otro %delante del original %para escapar.

Por ejemplo,

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

Salida:

%d of 23 = 23

fuente
1

¿Qué hay de esto?

$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);

Simplemente agregue su signo de porcentaje en su matriz de variables

Ochenta
fuente