src/main/java/com/networknt/oas/validator/msg/MessagesHelper.java
public static String format(Locale locale, Messages message, Object... args) {
		String formatString = message.getFormatString(locale);
		Object[] sortArgs = sortArgs(formatString, args);
		String printfString = Stream.of(formatString.split("%%"))
				.map(part -> placeholderPattern.matcher(part).replaceAll("%s")) //
				.collect(Collectors.joining("%%"));
		return String.format(printfString, sortArgs);
	}
public static String format(Locale locale, Messages message, Object... args) {
		String formatString = message.getFormatString(locale);
		Object[] sortArgs = sortArgs(formatString, args);
		String printfString = Stream.of(formatString.split("%%"))
				.map(part -> placeholderPattern.matcher(part).replaceAll("%s")) //
				.collect(Collectors.joining("%%"));
		return String.format(printfString, sortArgs);
	}
public static String format ( Locale locale , Messages message , Object ... args ) { String formatString = message . getFormatString ( locale ) ; Object [ ] sortArgs = sortArgs ( formatString , args ) ; String printfString = Stream . of ( formatString . split ( "%%" ) ) . map ( part -> placeholderPattern . matcher ( part ) . replaceAll ( "%s" ) ) // . collect ( Collectors . joining ( "%%" ) ) ; return String . format ( printfString , sortArgs ) ; }
Interpolate arguments into the message format string for the given message.
<p>
If a non-null locale is provided, an attempt is made to load a properties
file for the Message class of which this message is an instance, and the
property named by this message's name is used as the format string. If that
fails, or if the locale is null, the message object's default format string
is used.
<p>
The format string contains embedded place holders indicating where arguments
are to be substituted. Each place holder takes the form <code>%n</code> or
<code>%{n}</code>, where <code>n</code> is an integer from 1 to the number of
arguments. The second form allows interpolation at a site immediately
followed by other digits.
<p>
To prevent a percent sign from triggering interpolation, double it:
<code>%%</code>. For example, <code>"%%1 %%{2}"</code> will always produce
<code>"%1 %{2}"</code>.
<p>
The result is obtained by replacing each placeholder with the corresponding
argument's {@link #toString()} value (except that null arguments are rendered
as empty strings).

@param message Messages
@param args Args
@param locale Locale
@return message with interpolated arguments
Interpolate arguments into the message format string for the given message . <p > If a non - null locale is provided an attempt is made to load a properties file for the Message class of which this message is an instance and the property named by this message s name is used as the format string . If that fails or if the locale is null the message object s default format string is used . <p > The format string contains embedded place holders indicating where arguments are to be substituted . Each place holder takes the form <code > %n< / code > or <code > % { n } < / code > where <code > n< / code > is an integer from 1 to the number of arguments . The second form allows interpolation at a site immediately followed by other digits . <p > To prevent a percent sign from triggering interpolation double it : <code > %%< / code > . For example <code > %%1 %% { 2 } < / code > will always produce <code > %1 % { 2 } < / code > . <p > The result is obtained by replacing each placeholder with the corresponding argument s { @link #toString () } value ( except that null arguments are rendered as empty strings ) .