PHP sprintf уходит%

184

Я хочу следующий вывод: -

Около 50% от € 27,59 с вашего счета пополнения.

когда я делаю что-то вроде этого:

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

Но это дает мне эту ошибку , vsprintf() [function.vsprintf]: Too few arguments in ...потому что он считает , что %в системе 50%также для замены. Как мне избежать этого?

Сандипан Натх
источник
1
@Col. Shrapnel Мой вопрос касается vsprintf, а не printf, я использую его впервые и не могу предположить сходство между ними. Тем не менее, поиск escapeили escapingв обоих php.net/printfи в php.net/vsprintfобоих случаях не показывает ответ сразу. Когда я ищу, %%он показывает ответ в php.net/printf, но я не знал об этом %%!!! Вы искали ответ там перед голосованием?
Сандипан Нат
@sandeepan: vsprintfпринадлежит к тому же семейству функций, что и printf. Правильная документация для поиска формата - php.net/sprintf . Обе страницы даже указывают на это: «Смотрите sprintf () для описания формата». Вы хотя бы щелкнули по нему?
BoltClock
5
@Col. Шрапнель хорошо, хорошо, давайте возьмем php.net/sprintf, где ответ? Это на полпути вниз по странице With printf() and sprintf() functions, escape character is not backslash '\' but rather '%'.Что здесь внизу? Это было не так очевидно для меня, как для вас. Если вы найдете повторяющийся вопрос, вам лучше написать ссылку. Но я уверен, что многие найдут этот вопрос полезным. Но вы не примете это, и вы все равно что-то скажете, я знаю.
Сандипан Нат
о, я думал, что второй комментарий был полковником
Шрапнелем
3
У SO должен быть флаг для ответов RTFM. Это почти как люди, которые троллят, просто чтобы они могли сказать людям, чтобы они читали документы. Он нуждался в помощи и задавал вопрос, а затем кто-то услужливо ответил и получил за это очки. Мир продолжал развиваться, а Интернет использовался для чьей-либо выгоды. Тем временем я разгораюсь из-за двухлетнего спора.
rob5408

Ответы:

344

Побег это с другим %:

$stringWithVariables = 'About to deduct 50%% of %s %s from your Top-Up account.';
BoltClock
источник
22
sprintf ("SELECT * FROM ... WHERE name LIKE" %%% s %%% s %% '", $ fname, $ lname); - Ужасно, но это работает!
Ян Хеттих
1
Это также относится к Руби
Джейми Кук
Вы можете добавить эту часть с другим "% s": sprintf ('из% s вы можете получить% s', 'что-то', '50% ')
Lukas Liesis
Как избежать этого, если строка динамическая? Допустим,sprintf('This is %s.', the_title())
буджи
7
@madastrostr_replace('%', '%%', the_title())
Иванка Тодорова
3

Это очень просто.

Поставьте еще один %перед оригиналом, %чтобы избежать его.

Например,

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

Вывод:

%d of 23 = 23

источник
1

Как насчет этого:

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

Просто добавьте знак процента в массив переменных

3eighty
источник