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();
        }
    }
}
posted @ 2024-06-17 17:24  古法编程  阅读(21)  评论(0)    收藏  举报