String.format源码
时间: 2023-10-20 21:09:06 浏览: 160
String.format方法是Java中用于格式化字符串的方法,它的源码如下:
```java
public static String format(String format, Object... args) {
return new Formatter().format(format, args).toString();
}
```
该方法首先创建一个新的`Formatter`对象,然后调用`Formatter`的`format`方法进行字符串格式化,并将结果转换为字符串返回。
`Formatter`类的`format`方法可以接受多个参数,其中第一个参数表示要格式化的字符串,后面的参数是要替换到格式化字符串中的值。格式化字符串中通过`%`符号加上占位符来指定要替换的位置和类型,例如`%d`表示要替换一个整数,`%s`表示要替换一个字符串等。在`Formatter`的`format`方法中,可以使用这些占位符来指定要替换的值。
下面是`Formatter`的`format`方法的源码:
```java
public Formatter format(String format, Object... args) {
return format(Locale.getDefault(), format, args);
}
public Formatter format(Locale l, String format, Object... args) {
if (format == null)
throw new NullPointerException();
int last = -1;
for (int i = 0; i < format.length(); i++) {
char c = format.charAt(i);
if (c == '%') {
if (i == format.length() - 1)
throw new MissingFormatArgumentException(format);
if (last != -1)
output.append(format.substring(last, i));
char next = format.charAt(++i);
switch (next) {
case 's':
formatString((String) args[argIndex++], l);
break;
case 'd':
case 'o':
case 'x':
formatInteger(args[argIndex++], l, next);
break;
// ... 其他占位符的处理
default:
throw new UnknownFormatConversionException(String.valueOf(next));
}
last = i + 1;
} else if (c == '\\') {
if (i == format.length() - 1)
throw new IllegalArgumentException("Incomplete escape sequence at end of format string");
if (last != -1)
output.append(format.substring(last, i));
char next = format.charAt(++i);
output.append(escape(next));
last = i + 1;
}
}
if (last != -1 && last < format.length())
output.append(format.substring(last, format.length()));
if (argIndex < args.length)
throw new TooManyArgumentsException();
return this;
}
```
`format`方法首先会检查要格式化的字符串是否为null,然后遍历整个格式化字符串,根据占位符来决定如何替换。如果遇到了`%`符号,就会查看下一个字符来判断要替换的类型;如果遇到了`\`符号,就会将它后面的字符当作普通字符处理。
在处理占位符时,`Formatter`会根据占位符指定的类型来决定要如何格式化替换值。例如,当遇到`%d`时,会将要替换的值格式化为整数;当遇到`%s`时,会将要替换的值转换为字符串。
最终,`Formatter`会将所有替换后的字符串拼接起来,返回一个格式化后的字符串。
阅读全文