% De escape do PHP sprintf

184

Quero a seguinte saída: -

Prestes a deduzir 50% dos 27,59 € da sua conta de recarga.

quando eu faço algo assim: -

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

Mas isso me dá esse erro vsprintf() [function.vsprintf]: Too few arguments in ...porque considera o %in 50%também para substituição. Como eu escapei?

Sandeepan Nath
fonte
1
@Col. Estilhaços Minha pergunta é sobre vsprintf não printf, estou usando isso pela primeira vez e não pude assumir a semelhança entre os dois. No entanto, pesquisar escapeou escapingnos dois php.net/printfe em php.net/vsprintfambos não mostra a resposta imediatamente. Quando procuro, %%ele mostra a resposta em php.net/printf, mas eu não sabia %%!!! Você procurou a resposta lá antes da votação?
Sandeepan Nath
@ Sandeepan: vsprintfpertence à mesma família de funções que printf. A documentação correta para encontrar o formato, porém, é php.net/sprintf . As duas páginas apontam para ele: "Consulte sprintf () para obter uma descrição do formato". Você pelo menos não clicou?
BoltClock
5
@Col. Estilhaços ok tudo bem, vamos dar php.net/sprintf, onde está a resposta? Está na metade da página With printf() and sprintf() functions, escape character is not backslash '\' but rather '%'.O que há para votar aqui? Não era tão óbvio para mim como era para você. Se você encontrar uma pergunta duplicada, poderá escrever melhor o link. Mas tenho certeza que muitos acharão essa pergunta útil. Mas você não aceita isso e ainda diz algo, eu sei.
Sandeepan Nath
oh Eu pensei que o segundo comentário foi pelo coronel Shrapnel, desculpe
Sandeepan Nath
3
O SO deve ter um sinalizador para respostas RTFM. É quase como se as pessoas corressem para poder dizer às pessoas para lerem os documentos. Ele precisava de ajuda e fez uma pergunta e, em seguida, alguém respondeu prestativamente e conseguiu pontos. O mundo continuou e a internet foi usada para o benefício de alguém. Enquanto isso, estou esquentando uma discussão de dois anos.
rob5408

Respostas:

344

Escapar com outro %:

$stringWithVariables = 'About to deduct 50%% of %s %s from your Top-Up account.';
BoltClock
fonte
22
sprintf ("SELECT * FROM ... ONDE nome COMO '%%% s %%% s %%'", $ fname, $ lname); - Feio, mas funciona!
Jan Hettich
1
Isso também se aplica a Ruby
Jamie Cook
você pode adicionar essa parte com outro "% s": sprintf ('de% s, você pode obter% s', 'alguma coisa', '50% ') #
577 Lukas Liesis
Como você consegue escapar se a string é dinâmica? Vamos digamos,sprintf('This is %s.', the_title())
budji
7
@madastrostr_replace('%', '%%', the_title())
Ivanka Todorova
3

Isso é muito fácil.

Coloque outro %na frente do original %para escapar.

Por exemplo,

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

Resultado:

%d of 23 = 23

fonte
1

Que tal isso:

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

Basta adicionar seu sinal de porcentagem na sua matriz de variáveis

3 oitenta
fonte