ChatGPT解决这个技术问题 Extra ChatGPT

How to escape % in String.Format?

I am storing a SQL query in my strings.xml file and I want to use String.Format to build the final string in code. The SELECT statement uses a like, something like this:

SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE '%something%'

In order to format that I replace 'something' with %1$s so it becomes:

SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE \'%%1$s%\'

I escape the single quotes with the backslash. However I am not able to escape the % sign.

How can I include a like statement in my strings.xml file?

Don't forget to escape the %s properly.
They'd be injecting into their own database, no concern here ;)
Well, even if it is Your own database, it is possible to accidentally write queries that do bad things. Or just write queries that do not compile. Preparing queries is a good habit to get into.
Although it's slower than String.format() you might consider using MessageFormat() instead.

T
Tim Cooper

To escape %, you will need to double it up: %%.


C
Cavaleiro

To complement the previous stated solution, use:

str = str.replace("%", "%%");

This will replace % that are already doubled. Please read the other answer.
@Toilal Why would anyone escape something that is already escaped? And if he would, why not actually do it? Maybe he intended to have two % signs, so the correct escaped form would be '%%%%'
T
Toilal

This is a stronger regex replace that won't replace %% that are already doubled in the input.

str = str.replaceAll("(?:[^%]|\\A)%(?:[^%]|\\z)", "%%");