NET2Java之九:字符串格式化
字符串格式化输出也是开发常用功能之一,与.net中的string.Format()功能类似,java中也使用String.format()来格式化输出,与.net中使用{}不同,java中的占位一般都以%开始。
占位符(Conversion)
Conversion一般是26个英文单字,例如%s、%f,常见的占位符有:
- b:布尔
- s:字符串,非字符串类型则会先默认进行转换
- d:十进制输出
- f:浮点数
public class Main {
public static void main(String[] args) {
try {
System.out.println(String.format("%b", false)); //布尔
System.out.println(String.format("%s", 10)); //占位符
System.out.println(String.format("%d", 11)); //十进制输出
System.out.println(String.format("%f", 1.1)); //浮点数
System.out.println(String.format("%%")); //输出百分号
System.out.println(String.format("鹅鹅鹅%n曲项向天歌%n白毛浮绿水%n红掌拨清波")); //输出换行
} catch (Exception e) {
e.printStackTrace();
}
}
}
如果你使用了错误的占位符,或者使用了与占位符不相符的类型,均会抛出异常。
位置
如果我们需要使用多个格式化占位,则参数就要和格式化一一对应,如:
public class Main {
public static void main(String[] args) {
try {
System.out.println(String.format("%s今天跑了了%d米,%s觉得很累,所以%s早早的就睡了", "阿强", 100000, "阿强", "阿强"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
示例中的“阿强”用了多次,我们可以使用索引占位,如%1$s,不同.net,java的索引从1开始
public class Main {
public static void main(String[] args) {
try {
System.out.println(String.format("%1$s今天跑了了%2$d米,%1$s觉得很累,所以%1$s早早的就睡了", "阿珍", 100000));
} catch (Exception e) {
e.printStackTrace();
}
}
}
格式
format中还提供了一些方式来控制输出的格式,比如通过%2d将字符串最小长度设置为2,不足2位的以0补齐,直接看示例即可:
public class Main {
public static void main(String[] args) {
try {
//-设置最小宽度
System.out.println(String.format("%-2d:%-2d:%-2d", -1,2,100)); //-1:2 :100
//设置最小宽度并用0填充
System.out.println(String.format("%02d:%02d:%02d", -1,2,100)); //-1:02:100
//整数前面是+号,负数前面是-号
System.out.println(String.format("%+d:%+d:%+d", -1,2,100)); //-1:+2:+100
//' '正直前面加空格,负值前面加-
System.out.println(String.format("% d:% d:% d", -1,2,100)); //-1: 2: 100
//千分位计数
System.out.println(String.format("%,d",10244068)); //10,244,068
//控制小数点后的精度
System.out.println(String.format("%.2f", 1.1)); //1.10
} catch (Exception e) {
e.printStackTrace();
}
}
}
日期
日期的格式化是最常见的格式之一,之前我们提到了日期中使用DateTimeFormatter来格式化,String.format也提供了简单的日期格式化操作,格式为:%t【控制符】。
public class Main {
public static void main(String[] args) {
try {
//常见的日志类型均可以作为参数
//t+格式
//保留两位小数
System.out.println(String.format("输出小时:%tH", LocalTime.now())); //H是24小时制,h是12小时制,不足两位补0
System.out.println(String.format("输出小时:%tl", LocalTime.now())); //k是24小时制,l是12小时制,不足两位不补0
System.out.println(String.format("输出分钟:%tM", LocalTime.now())); //不足两位补0
System.out.println(String.format("输出秒:%tS", LocalTime.now())); //不足两位补0
System.out.println(String.format("输出毫秒:%tL", LocalTime.now())); //不足三位补0
System.out.println(String.format("输出纳秒:%tN", LocalTime.now())); //不足九位补0
System.out.println(String.format("输出上下午:%tp", LocalTime.now()));
System.out.println(String.format("输出上时区:%tz", Calendar.getInstance()));
System.out.println(String.format("输出从1970-1-1 00:00:00到现在经历的秒数:%ts", Calendar.getInstance()));
System.out.println(String.format("输出从1970-1-1 00:00:00到现在经历的毫秒数:%tQ", Calendar.getInstance()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
不过与.net中string.Format中更为相似的却是MessageFormat,比如:
public class Main {
public static void main(String[] args) {
try {
System.out.println(MessageFormat.format("{0}今年{1}岁", "张三", 18));
} catch (Exception e) {
e.printStackTrace();
}
}
}

浙公网安备 33010602011771号