再探Java基础——String.format(String format, Object… args)的使用
最近看到类似这样的一些代码:String.format("参数%s不能为空", "birthday"); 以前还没用过这功能不知咐意思,后研究了一下,详细讲解如下。
public static String format(String format, Object... args)的功能非常强大,用法非常灵活。主要的意思是返回指定的格式化的字符串。Format参数为格式字符串语法如下:
%[argument_index$][flags][width][.precision]conversion
“[]”里的参数表示可选。
可选的 argument_index :下标是一个十进制整数,用于表明参数在参数列表中的位置。
可选的 flags 标志是修改输出格式的字符集。有效标志的集合取决于转换类型。
可选 width 最小宽度是一个非负十进制整数,表明要向输出中写入的最少字符数。
可选 precision 是一个非负十进制整数,通常用来限制字符数。特定行为取决于转换类型。
所需的 conversion转换方式是一个表明应该如何格式化参数的字符。给定参数的有效转换集合取决于参数的数据类型。
上面解释比较枯燥,代码举例如下;
Eg1:说明argument_index和width
System.out.println(msg);
String s = String.format("this is a %2$s %1$s %s %s test", "java", "C++");
this is a C++ java java C++ test
Eg2.说明 flags
System.out.println(String.format("%1$,09d", -3872));
System.out.println(String.format("%1$,010d", -3872));
System.out.println(String.format("%1$,09d", 3872));
System.out.println(String.format("%1$9d", -14));
System.out.println(String.format("%1$-9d", -14));
System.out.println(String.format("%1$(9d", -14));
System.out.println(String.format("%1$#9x", 31));
结果:
-0003,872
-00003,872
00003,872
-14
-14
(14)
0x1f
下表总结了受支持的标志。y 表示该标志受指示参数类型支持。
标志 |
常规 |
字符 |
整数 |
浮点 |
日期/时间 |
说明 |
'-' |
y |
y |
y |
y |
y |
结果将是左对齐的。 |
'#' |
y1 |
- |
y3 |
y |
- |
结果应该使用依赖于转换类型的替换形式 |
'+' |
- |
- |
y4 |
y |
- |
结果总是包括一个符号 |
' ' |
- |
- |
y4 |
y |
- |
对于正值,结果中将包括一个前导空格 |
'0' |
- |
- |
y |
y |
- |
结果将用零来填充 |
',' |
- |
- |
y2 |
y5 |
- |
结果将包括特定于语言环境的组分隔符 |
'(' |
- |
- |
y4 |
y5 |
- |
结果将是用圆括号括起来的负数 |
Eg3:说明conversion
System.out.println(String.format("this is:%s %s", "string", "format"));
System.out.println(String.format("%b, %b, %b, %b, %b, %b", "true",true, false, null, 0>1, 1, ""));
System.out.println(String.format("%o", 31));
System.out.println(String.format("%x", 31));
System.out.println(String.format("%e", 12345.6987));
System.out.println(String.format("%a", 12345.6987));
System.out.println(String.format("%c, %c, %c, %c", 'a', 'b', 48, 98));
结果:
this is:string format
true, true, false, false, false, true
37
1f
1.234570e+04
0x1.81cd96f0068dcp13
a, b, 0, b
标志的说明:
转换 |
参数类别 |
说明 |
'b', 'B' |
常规 |
如果参数 arg 为 null,则结果为 "false"。如果 arg 是一个 boolean 值或 Boolean,则结果为 String.valueOf() 返回的字符串。否则结果为 "true"。 |
'h', 'H' |
常规 |
如果参数 arg 为 null,则结果为 "null"。否则,结果为调用 Integer.toHexString(arg.hashCode()) 得到的结果。 |
's', 'S' |
常规 |
如果参数 arg 为 null,则结果为 "null"。如果 arg 实现 Formattable,则调用 arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。 |
'c', 'C' |
字符 |
结果是一个 Unicode 字符 |
'd' |
整数 |
结果被格式化为十进制整数 |
'o' |
整数 |
结果被格式化为八进制整数 |
'x', 'X' |
整数 |
结果被格式化为十六进制整数 |
'e', 'E' |
浮点 |
结果被格式化为用计算机科学记数法表示的十进制数 |
'f' |
浮点 |
结果被格式化为十进制数 |
'g', 'G' |
浮点 |
根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。 |
'a', 'A' |
浮点 |
结果被格式化为带有效位数和指数的十六进制浮点数 |
't', 'T' |
日期/时间 |
日期和时间转换字符的前缀。请参阅日期/时间转换。 |
'%' |
百分比 |
结果为字面值 '%' ('\u0025') |
'n' |
行分隔符 |
结果为特定于平台的行分隔符 |
String msg = String.format("参数%s不能为空", "birthday");
System.out.println(msg);
Eg4:格式化日期
Calendar c = Calendar.getInstance();
String data_str = String.format("today is: %1$tY/%1$tm/%1$te, now time is %1$tH:%1$tM:%1$tS", c);
结果:
today is: 2013/10/31, now time is 17:36:49
日期类标志的说明:
以下日期和时间转换字符后缀是为 't' 和 'T' 转换定义的。这些类型类似于但不完全等同于 GNU date 和 POSIX strftime(3c) 定义的那些类型。提供其他转换类型是为了访问特定于Java 的功能(例如,'L' 用于秒中的毫秒)。
以下转换字符用来格式化时间:
'H' |
'\u0048' |
24 小时制的小时,被格式化为必要时带前导零的两位数,即 00 - 23。00 对应午夜。 |
'I' |
'\u0049' |
12 小时制的小时,被格式化为必要时带前导零的两位数,即 01 - 12。01 对应于 1 点钟(上午或下午)。 |
'k' |
'\u006b' |
24 小时制的小时,即 0 - 23。0 对应于午夜。 |
'l' |
'\u006c' |
12 小时制的小时,即 1 - 12。1 对应于上午或下午的一点钟。 |
'M' |
'\u004d' |
小时中的分钟,被格式化为必要时带前导零的两位数,即 00 - 59。 |
'S' |
'\u0053' |
分钟中的秒,被格式化为必要时带前导零的两位数,即 00 - 60("60" 是支持闰秒所需的一个特殊值)。 |
'L' |
'\u004c' |
秒中的毫秒,被格式化为必要时带前导零的三位数,即 000 - 999。 |
'N' |
'\u004e' |
秒中的毫微秒,被格式化为必要时带前导零的九位数,即 000000000 - 999999999。此值的精度受基础操作系统或硬件分析的限制。 |
'p' |
'\u0070' |
特定于语言环境的上午或下午标记以小写形式表示,例如 "am" 或 "pm"。使用转换前缀 'T' 可以强行将此输出转换为大写形式。(注意,'p' 产生的输出是小写的。而GNU date 和 POSIX strftime(3c) 产生的输出是大写的。) |
'z' |
'\u007a' |
相对于 GMT 的 RFC 822 格式的数字时区偏移量,例如 -0800。 |
'Z' |
'\u005a' |
表示时区的缩写形式的字符串。 |
's' |
'\u0073' |
自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的秒数,也就是 Long.MIN_VALUE/1000 与 Long.MAX_VALUE/1000 之间的差值。 |
'Q' |
'\u004f' |
自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的毫秒数,即 Long.MIN_VALUE 与 Long.MAX_VALUE 之间的差值。此值的精度受基础操作系统或硬件分析的限制。 |
以下转换字符用来格式化日期:
'B' |
'\u0042' |
特定于语言环境的完整月份名称,例如 "January" 和 "February"。 |
'b' |
'\u0062' |
特定于语言环境的月份简称,例如 "Jan" 和 "Feb"。 |
'h' |
'\u0068' |
与 'b' 相同。 |
'A' |
'\u0041' |
特定于语言环境的星期几的全称,例如 "Sunday" 和 "Monday" |
'a' |
'\u0061' |
特定于语言环境的星期几的简称,例如 "Sun" 和 "Mon" |
'C' |
'\u0043' |
除以 100 的四位数表示的年份,被格式化为必要时带前导零的两位数,即 00 - 99 |
'Y' |
'\u0059' |
年份,被格式化为必要时带前导零的四位数(至少),例如 0092 等于格里高利历的 92 CE。 |
'y' |
'\u0079' |
年份的最后两位数,被格式化为必要时带前导零的两位数,即 00 - 99。 |
'j' |
'\u006a' |
一年中的天数,被格式化为必要时带前导零的三位数,例如,对于格里高利历是 001 - 366。001 对应于一年中的第一天。 |
'm' |
'\u006d' |
月份,被格式化为必要时带前导零的两位数,即 01 - 13,其中 "01" 是一年的第一个月,("13" 是支持阴历所需的一个特殊值)。 |
'd' |
'\u0064' |
一个月中的天数,被格式化为必要时带前导零的两位数,即 01 - 31,其中 "01" 是一个月的第一天。 |
'e' |
'\u0065' |
一个月中的天数,被格式化为两位数,即 1 - 31,其中 "1" 是一个月中的第一天。 |
以下转换字符用于格式化常见的日期/时间组合。
'R' |
'\u0052' |
24 小时制的时间,被格式化为 "%tH:%tM" |
'T' |
'\u0054' |
24 小时制的时间,被格式化为 "%tH:%tM:%tS"。 |
'r' |
'\u0072' |
12 小时制的时间,被格式化为 "%tI:%tM:%tS %Tp"。上午或下午标记 ('%Tp') 的位置可能与地区有关。 |
'D' |
'\u0044' |
日期,被格式化为 "%tm/%td/%ty"。 |
'F' |
'\u0046' |
ISO 8601 格式的完整日期,被格式化为 "%tY-%tm-%td"。 |
'c' |
'\u0063' |
日期和时间,被格式化为 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969"。 |
具体的自个再看文档去吧!
再探Java基础——String.format(String format, Object… args)的使用的更多相关文章
- 再探java基础——break和continue的用法
再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...
- 再探Java基础——throw与throws
http://blog.csdn.net/luoweifu/article/details/10721543 异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待 ...
- 再探java基础——对面向对象的理解(2)
对象.类和抽象类的区别 对象是一个具体的事物,类是对具有相同属性和行为的一组对象的抽象,对象是类的一个一个人的具体实例:抽象类是一种特殊的类,是对类的进一步抽象,抽象类不能被实例化. 类.抽象类和接口 ...
- 再探java基础——零碎基础知识整理
1.java是解释型语言.java虚拟机能实现一次编译多次运行. 2.JDK(java software Development kit 软件开发包),JRE(java Runtime Environ ...
- 再探java基础——对面向对象的理解(1)
对象 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则.计划或事件.对象具有属性和行为,在程序设计中对象实现了数据和操作的结合,使数 ...
- [转] 再探java基础——break和continue的用法
原文地址:http://blog.csdn.net/luoweifu/article/details/10756017 break break可用于循环和switch...case...语句中. 用于 ...
- Java基础-字符串(String)常用方法
Java基础-字符串(String)常用方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.java的API概念 Java的API(API:Application(应用) Pr ...
- Java基础知识系列——String
最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...
- JAVA基础学习之String、StringBuffer、StringBuilder、基本数据类型的使用、整形进制转换、集合Collection、Vector、ArrayList、LinkedList、HashSet、TreeSet等(3)
主函数类MainDemo.java package com.itcast.test20140109; import java.util.ArrayList; import java.util.Coll ...
随机推荐
- 安卓应用开发用户体验之禁止EditText自动获取焦点
一.问题描述: 在安卓应用开发时,经常会在同一个页面有许多不同的控件,在用户操作时,如何正确的在这些控件之间来回切换是良好用户体验的重要问题.可能会碰到如下问题:在点击页面内某控件时(假设控件为Spi ...
- 使用C#连接ORACLE数据库
一.使用OracleClient组件连接Oracle .Net框架的System.Data.OracleClient.dll组件(ADO.Net组件),为连接和使用Oracle数据库提供了很大的方 ...
- 12 Integer to Roman(int转罗马数字Medium)
题目意思:1-3999转罗马数字 思路:从大往小减 ps:这题有点蛋疼 class Solution { public: string intToRoman(int num) { string a[] ...
- 基于memcached中命令分析函数tokenize_command改造的split函数
今天使用C重构php代码,需要手写一个split函数,于是就模仿memcached中获取用户命令的函数 static size_t tokenize_command(char *command, to ...
- Develop a Packet Sniffer with libpcap
Develop a Packet Sniffer with libpcap: http://vichargrave.com/develop-a-packet-sniffer-with-libpcap/
- 第三代搜索推出网民评价系统,seo末日还会远吗?
昨天的360搜索可谓风光无限,两大搜索新品同日上线,至今360导航页面依旧飘荡着两者的身影,但是不少站长从此却是忧心忡忡,seo末日是否真的要到来了?笔者想起数日前写的一篇博文:seo末日言论频频来袭 ...
- COJ 3018 求1~n之间的素数
求1~n之间的素数 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 素数是大于1,且除1和本身以外不能被其他整数所整除的数. ...
- BZOJ1642: [Usaco2007 Nov]Milking Time 挤奶时间
1642: [Usaco2007 Nov]Milking Time 挤奶时间 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 525 Solved: 30 ...
- Buy the Ticket HDU 1133 递推+大数
题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1133 题目大意: 有m+n个人去买电影票,每张电影票50元, m个人是只有50元一张的, n个人 ...
- JavaScript权威指南学习笔记5
下午在杭图回去前看了书中第二部分的13-17章,看的很粗,感觉大部分东西自己已经知道或者平时开发中不会用到,很多章节只是简单的翻了一下,没有仔细思考里面说到的道理,下面对各章节简单的记录下. 第13章 ...