java 格式化 布尔型_这么久才知道Java中的format很强大!

Java中允许我们对指定的对象进行某种格式化,从而得到我们想要的格式化样式。

d1c47c06a8c51c38e3fcf867db3116f7.png

Format

首先介绍java.text包中的Format

Foramt是一个抽象基类,其具体子类必须实现

format(Object obj, StringBuffer toAppendTo, FieldPosition pos)

parseObject(String source, ParsePosition pos)

两个抽象方法。

format方法用于将对象格式化为指定模式的字符串

parseObject方法用于将字符串重新解析为对象

Format的直接子类包括DateFormat、NumberFormat和MessageFormat。下面一一进行介绍

1.DateFormat

DateFormat根据当前语言环境格式化日期和时间。

DateFormat是一个抽象类,所以不能直接new创建实例对象。但该类为我们提供了工厂方法方便我们使用。

1.getDateInstance()方法,获取格式化的日期,输出样式:2015-12-102.getDateTimeInstance()方法,获取格式化的日期和时间,输出样式:2015-12-10 10:21:413.getTimeInstance()方法,获取格式化的时间,输出样式:10:21:414.getInstance()方法,获取格式化的日期和时间,输出样式:15-12-10 上午10:21

也许你会发现,在这些工厂发放中允许我们传入一个int参数,该参数允许我们设定格式化风格,从而得到我们相对理想的结果。下表中对应了不同的style值和输出样式(这些常量值都在DateFormat类中)样式值日期时间SHORT15-12-10上午10:08

MEDIUM2015-12-1010:09:23

LONG2015年12月10日上午10时09分40秒

FULL2015年12月10日 星期四上午10时17分30秒 CST

DEFAULT2015-12-1010:18:07

当然你也可以指定语言环境获取该语言环境下的格式化日期和时间,

DateFormat format = DateFormat.getDateInstance(DateFormat.DEFAULT,Locale.CANADA);//获取加拿大的格式化日期

也许你要发问了,上面的格式没有我一个想要的啊。那好,这里还有一个好东西SimpleDateFormat

SimpleDateFormat是DateFormat的一个具体类,它允许我们指定格式模式从而获取我们理想的格式化日期和时间。

通过SimpleDateFormat的构造方法你可以传入一个格式模式字符串或者通过applyPattern(String pattern)方法添加一个格式模式字符串。

对于格式模式字符串,API为我们提供了丰富的模式元素,下面列出几个常用的模式元素字母日期或时间元素示例y年2015

M年中的月份12

w年中的周数50

W月份中的周数02

D年中的天数344

d月份中的天数10

F月份中的星期02

E星期中的天数星期四、Thu

aAM/PM标记下午、PM

H一天中的小时数(0~23)21

k一天中的小时数(1~24)21

Kam/pm中的小时数(0~11)09

ham/pm中的小时数(1~12)09

m小时中的分钟数31

s分钟中的秒数08

S毫秒数716

如果你设置Locale的话,会有不同的显示格式,比如如果设置Locale.ENGLISH,E会显示为英文格式,a显示为AM或PM

Date date = new Date();SimpleDateFormat format = new SimpleDateFormat("今天是yyyy-MM-dd E hh:mm:ss,是yyyy年的第DD天,在该月是第dd天");System.out.println(format.format(date));将会输出:今天是2015-12-10 星期四 09:38:16,是2015年的第344天,在该月是第10天

2.NumberFormat

NumberFormat根据当前语言环境格式化数字

NumberFormat同样是一个抽象基类,可以使用API中的工厂方法获取实例对象

1.getCurrencyInstance()方法,根据当前语言环境获取货币数值格式。传递Locale对象可以获取指定语言环境下的货币数值格式,比如

NumberFormat format = NumberFormat.getCurrencyInstance(Locale.CANADA);System.out.println(format.format(439.6));

将会输出:$439.60

2.getInstance()和getNumberInstance()方法都会获取到常规数值格式

3.getIntegerInstance()方法获取常规整数值格式,如果需要格式化的数值为小数,则会将数值四舍五入为最接近的整数

4.getPercentInstance()方法获取百分比的数值格式

NumberFormat有两个具体实现子类DecimalFormat和ChoiceFormatDecimalFormat

DecimalFormat同SimpleDateFormat类似,允许我们指定格式模式获取我们想要的格式化数值

DecimalFormat类对于数值的小数部分,默认显示3位小数,在去掉超出小数点后面3位的部分时,会将数值四舍五入为最接近的数值格式化输出。淡然我们可以对这个默认进行设置

setMaximumFractionDigits(int newValue)方法,设置小数部分中允许的最大数字位数

setMinimumFractionDigits(int newValue)方法,设置小数部分中允许的最小数字位数,如果原数小数位数不够的话,会补零。

对于数值的整数部分,默认3个数字为一组进行显示,同样对此我们也可以自定义,使用setGroupingSize(int i)方法,设置分组中一组的位数。

setGroupingUsed(boolean value)方法设置是否使用分组,true表示使用,false表示取消分组

setMaximumIntegerDigits(int newValue)方法设置整数部分允许的最大数字位数

setMinimumIntegerDigits(int newValue)方法设置整数部分允许的最小数字位数

在````的构造方法中,允许我们传入格式模式字符串输出我们想要的格式化数值,格式模式元素包含如下

||

----|------------|------

0 | 表示一个数字,被格式化数值不够的位数会补0

| 表示一个数字,被格式化数值不够的位数会忽略

. | 小数点分隔符的占位符

, | 分组分隔符的占位符| 缺省负数前缀

% | 将数值乘以100并显示为百分数

\u2030 | 将数值乘以1000并显示为千分数

再次

DecimalFormat format1 = new DecimalFormat("#\u2030");System.out.println(format1.format(0.3345));//输出334‰ DecimalFormat format2 = new DecimalFormat("##.##");System.out.println(format2.format(12.345));//输出12.35 DecimalFormat format3 = new DecimalFormat("0000.00");System.out.println(format3.format(12.345));//输出0012.35 DecimalFormat format4 = new DecimalFormat("#.##%");System.out.println(format4.format(12.345));//输出1234.5%ChoiceFormat

ChoiceFormat允许将格式化运用到某个范围的数,通常与MessageFormat一同使用。ChoiceFormat在构造方法中接收一个format数组和一个limits数组,这两个数组的长度必须相等,例如:

limits = {1,2,3,4,5,6,7}formats = {"Sun","Mon","Tue","Wed","Thur","Fri","Sat"}

limits数组实际上是个区间,可开可闭,并且必须按升序排列,如果不按升序排列,格式化结果将会不正确,还可以使用\u221E(表示无穷大)。

ChoiceFormat的匹配公式limit[j] <= X

其中X表示使用format方法传入的值,j表示limit数组中的索引。当且仅当上述公式成立时,X匹配j,如果不能匹配,则会根据X是太小还是太大,匹配limits数组的第一个索引或最后一个索引,然后使用匹配的limits数组中的索引,去formats数组中寻找相同索引的值。例子:

double[] limits = { 3, 4, 5, 6, 7, 8, 9 };String[] formats = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };ChoiceFormat format = new ChoiceFormat(limits, formats);System.out.println(format.format(2.5));//将会输出"星期一"/**3.6介于3和4之间,所以会匹配3,又由于3在limits数组中的索引是0,所以会在formats数组徐照索引0的值,即输出"星期一"*/System.out.println(format.format(3.6));

下面看一下ChoiceFormat类中的几个常用方法

1.nextDouble(double d)静态方法查找大于d的最小double值,用在limits数组中,从而使limits数组形成一个右开区间数组,例如

limits = {0,1,ChoiceFormat.nextDouble(1)}

2.nextDouble(double d, boolean positive)静态方法,如果positive参数为true,表示查找大于d的最小double值;如果positive参数为false,表示查找小于d的最大double值,这样就可以使limits形成一个左开区间数组。

3.previousDouble(double d)静态方法,查找小于d的最大double值

ChoiceFormat类的构造方法也允许我们传入一个模式字符串,format方法会根据这个模式字符串执行格式化操作。一个模式元素的格式如下:doubleNum [占位符] formatStr

占位符可以使用#、<  、\u2264(<=)

ChoiceFormat cf = new ChoiceFormat("1#is 1 | 1

由上面的例子可以看出,模式字符串中的每个模式元素之间使用"|"分割,"|"前后可以添加空格以美化代码,而且必须按照升序进行书写,否则会出现java.lang.IllegalArgumentException的运行时异常。

观看ChoiceFormat类的源码我们得知,实际上在内部,模式字符串还是被转换为limits和formats两个数组。在源码中

public ChoiceFormat(String newPattern)  {applyPattern(newPattern);}/** applyPattern(newPattern)方法的部分源码*/public void applyPattern(String newPattern) {...choiceLimits = new double[count];System.arraycopy(newChoiceLimits, 0, choiceLimits, 0, count);choiceFormats = new String[count];System.arraycopy(newChoiceFormats, 0, choiceFormats, 0, count);...}

可以看出ChoiceFormat(String newPattern)调用了applyPattern(String newPattern)方法,在applyPattern方法中对newPattern字符串进行解析,然后将解析后的数据放置到ChoiceFormat类的两个私有属性double[] choiceLimits和String[] choiceFormats中,然后使用格式化方法即可。

3.MessageFormat

MessageFormat提供了以语言环境无关的生成连接消息的方式。

常用MessageFormat的静态方法format,该方法接收一个字符串的模式和一组对象(对象数组),按照模式形式将格式化的对象插入到模式中,然后返回字符串结果。

MessageFormat的格式模式元素(FormatElement)形式如下:

{ArgumentIndex}

{ArgumentIndex,FormatType}

{ArgumentIndex,FormatType,FormatStyle}

其中ArgumentIndex对象数组中的索引,从0开始,

FormatType包括number、date、 time、choice,

FormatStyle包括short、medium、long、full、integer、currency、percent、SubformatPattern(子模式),

在MessageFormat类的内部,FormatType和FormatStyle实际上是创建格式元素的Format示例

number对应了NumberFormat,其子格式对应了DecimalFormat

date和time对应了DateFormat,其资格是对应了SimpleDateFormat

choice对应了ChoiceFormat

敢说没有意思,来多举几个栗子:

你可以直接使用MessageFormat类中的静态方法format,像这样:

/**这是源码注释中的一个例子* 在这个例子中静态方法format第一个参数是字符串类型的,* 即模式字符串,第二个参数是个可变参数,实际上就是一个Object类型的数组。* 在模式字符串中使用"{}"标识一个FormatElement。"{}"中的ArgumentIndex对应Object数组中响应索引处的值。*/int planet = 7;String event = "a disturbance in the Force";String result = MessageFormat.format("At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",                  planet, new Date(), event);System.out.println(result);

//输出:At 20:39:15 on 2015-12-11, there was a disturbance in the Force on planet 7.

你也可以使用MessageFormat的构造方法传入pattern string(模式字符串),然后调用普通的format方法,在这里就不举栗子了。

我们不仅被允许使用MessageFormat类中提供默认的FormatElement去format这些对象,还可以设置自己的Format对象format这些Object。

/**在这个例子中,MessageFormat和ChoiceFormat被结合使用* MessageFormat类中有3个方法值的我们关注* 1.setFormatByArgumentIndex(int argumentIndex, Format newFormat)//* 2.setFormats(Format[] newFormats)* 3.setFormat(int formatElementIndex, Format newFormat)* 在这个例子当中,在MessageFormat的模式字符串的FormatElement(即{}中的内容)中* 索引为0的地方将使用ChoiceFormat的格式去格式化。* 如果在set的Format中仍具有FormatElement,则会递归调用MessageFormat的format方法。*/MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");double[] filelimits = { 0, 1, 2 };String[] filepart = { "no files", "one file", "{0,number} files" };ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);form.setFormatByArgumentIndex(0, fileform);int fileCount = 1273;String diskName = "MyDisk";Object[] testArgs = { new Long(fileCount), diskName };System.out.println(form.format(testArgs));//输出:The disk "MyDisk" contains 1,273 files.

4.String类中的format方法

format方法使用占位符进行格式化

常规类型、字符类型和数值类型的占位符格式:

%[index$][标识][最小宽度][.精度]转换符

日期和时间类型的占位符格式:

%[index$][标识][最小宽度]转换符

与参数不对应的占位符格式:

%[标识][最小宽度]转换符

其中index表示参数列表中的位置上的值

可用标识:标识含义-在最小宽度内左对齐,不可与0标识一起使用

0若内容长度不足最小宽度,则在左边用0来填充

#对8进制和16进制,8进制前添加一个0,16进制前添加0x

+结果总包含一个+或-号

空格正数前加空格,负数前加-号

,只用与十进制,每3位数字间用,分隔

(若结果为负数,则用括号括住,且不显示符号

可用转换符:转换符含义b布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false

n平台独立的换行符, 也可通过System.getProperty("line.separator")获取

f浮点数型(十进制)。显示9位有效数字,且会进行四舍五入。如99.99

a浮点数型(十六进制)

e指数类型。如9.38e+5

g浮点数型(比%f,%a长度短些,显示6位有效数字,且会进行四舍五入)

s字符串类型

c字符类型

String result1 = String.format("小明今年%d岁,他住在%s,他的月工资有%.2f", 25,"北京市",6633.435);System.out.println(result1);//输出:小明今年25岁,他住在北京市,他的月工资有6633.44/*****************************************************/double num = 123.4567899;String result2 = String.format("%e", num);System.out.println(result2);//输出:1.234568e+02

总结

1.Format中的子类都是不同步,所以需要注意线程安全问题

2.可能在某些地方我解释的还是不太清楚。学习最重要的是多去尝试,多编写代码测试,如果仅仅靠看就能学会的话,那你就看吧、

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【腾讯优测干货分享】从压测工具谈并发、压力、吞吐量

本文来自于腾讯bugly开发者社区&#xff0c;非经作者同意&#xff0c;请勿转载&#xff0c;原文地址&#xff1a;http://dev.qq.com/topic/580d914e07b7fc1c26a0cf7c 前言 随着部门业务的拓展&#xff0c;我们有了很多性能测试的机会&#xff0c;但在实战中&#xff0c;慢慢发现…

MySQL5.6 PERFORMANCE_SCHEMA 说明

背景&#xff1a; MySQL 5.5开始新增一个数据库&#xff1a;PERFORMANCE_SCHEMA&#xff0c;主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA&#xff0c;而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.5默认是关闭的&#xff0c;…

04_类与对象_课程动手动脑问题以及课后实验性问题及解答集锦

Answer: 动手动脑&#xff1a; 1——以下代码为何无法通过编译&#xff1f;哪儿出错了&#xff1f; Answer: 因为类Foo的构造函数是有一个参数的&#xff0c;所以我们在new一个Foo类的对象时必须赋予一个符合条件的实参。 2—— 请运行TestStaticInitializeBlock.java示例&…

php如果能编译就完美了,centos7 完美编译PHP7 php-7.2.10.tar.gz

1.下载去官网下载。2、上传并解压tar -zxvf php-7.2.10.tar.gz3、进入文件夹cd php-7.2.104、安装相关依赖包yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel gd gd-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel e2fsprogs e…

2017年php还能火多久,PHP还会火吗?

据不完全数据得知&#xff0c;我国对PHP人才非常紧缺&#xff0c;大约每年有50万人左右。伴随着近几年信息化&#xff0c;智能化&#xff0c;网络化的发展&#xff0c;PHP的发展前景也是不可估量的&#xff0c;那么&#xff0c;你知道是什么影响PHP继续火热的吗?下面我们就来分…

[JZOJ P1288] [DP]矩阵取数

kaike 传送门 07年noipT3&#xff1f; 要我写我肯定放弃 嗯没错就是这么果断 据说要 高精 DP 状态&#xff1f; 举例说明&#xff0c;假设有矩阵 a1,a2,a3,a4....an b1,b2,b3,b4....bn 假设矩阵的最大得分取法为 a1*2b1*2a2*4b2*4a3*8b3*8.....an*2^nb2*2^n&#xff1b; 可以转…

Linux命令入门

// 查看日历cal // 修改密码passwd // 查看目录和文件ls -lls // 查看当前用户信息whoami // 查看当前在线用户userswho 在Linux中&#xff0c;可以使用 vi 编辑器创建一个文本文件&#xff0c;例如&#xff1a;$ vi filename上面的命令会创建文件 filename 并打开&#xff0c;…

Bug2算法的实现(RobotBASIC环境中仿真)

移动机器人智能的一个重要标志就是自主导航&#xff0c;而实现机器人自主导航有个基本要求——避障。之前简单介绍过Bug避障算法&#xff0c;但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象&#xff0c;只能说似懂非懂。我不是天才&#xff0c;不能看几遍就理解理论中…

策略模式场景举例

容错恢复机制 容错恢复机制是应用程序开发中非常常见的功能。那么什么是容错恢复呢&#xff1f;简单点说就是&#xff1a;程序运行的时候&#xff0c;正常情况下应该按照某种方式来做&#xff0c;如果按照某种方式来做发生错误的话&#xff0c;系统并不会崩溃&#xff0…

php写抢票脚本,火车票抢票python代码公开揭秘!

市场上很多火车票抢票软件大家应该非常熟悉&#xff0c;但很少有人研究具体是怎么实现的&#xff0c;所以觉得很神秘&#xff0c;其实很简单。下面使用Python模拟抢票程序&#xff0c;给大家揭秘抢票到底是怎么回事。该代码仅供参考&#xff0c;主要用于大家沟通交流&#xff0…

代理模式——HeadFirst设计模式学习笔记

代理模式&#xff1a;为另一个对象提供一个替身或占位符控制这个对象的访问 特点&#xff1a; 让代理对象控制对象的访问&#xff0c;被代理对象可以是远程对象&#xff08;远程代理&#xff09;&#xff0c;创建开销较大对象&#xff08;虚拟代理&#xff09;&#xff0c;或需…

cursor用法java,Cursor的基本使用方法

Cursor的基本使用方法今天在用到Cursor的时候发现&#xff0c;有很多游标相关的知识还是有欠缺&#xff0c;在网上搜了篇基础讲解的文&#xff0c;觉得还不错&#xff0c;自己整理了一下发上来。虽然很基础&#xff0c;但是有一些内容之前确实没有很扎实得掌握&#xff0c;所以…

win7(64位)php5.5-Apache2.4-mysql5.6环境安装

win7&#xff08;64位&#xff09;安装搭建 php-5.5.10 apache2.4.7 mysql-5.6.16 环境 工具/原料 php-5.5.10-Win32-VC11-x64.zip 下载地址: http://windows.php.net/download/ httpd-2.4.7-win64-VC11.zip 下载地址: http://www.apachelounge.com/download/ mysql-5.6.16-win…

php开发环境 ubuntu,Ubuntu配置PHP开发环境

开发环境安装目前web服务器有很多&#xff0c;本文安装Apache服务器&#xff1b;本文使用的服务器是Mysql服务器。sudo apt install apache2常用命令重启Apache&#xff1a;sudo /etc/init.d/apache2 restart重启php&#xff1a;sudo /etc/init.d/php-fapm restart配置apache服…

php基础知识总结大全,php基础知识回顾 —— 常量

您现在的位置是&#xff1a;网站首页>>PHP>>phpphp基础知识回顾 —— 常量发布时间&#xff1a;2019-01-23 17:23:08作者&#xff1a;wangjian浏览量&#xff1a;489点赞量&#xff1a;0在PHP中有这样一类变量&#xff0c;当变量值被定义之后&#xff0c;它的值就不…

Android Studio 下使用git -- 个人,本地版本控制

第一步&#xff1a;下载安装git 下载地址 : https://git-scm.com/downloads 第二步&#xff1a;Android Studio 下配置git路径。 配置之后&#xff0c;Test弹出如下成功的提示即可。 第三步&#xff1a;创建版本库 选择项目的根目录比较适合。 第四步&#xff1a;添加需要版本控…

oracle忽略除数为0,ora-01476除数为0的解决办法,oracle中decode()的使用

执行报表查询&#xff0c;固定的一个时间点没有数据&#xff0c;应该是有数据的&#xff0c;把前一个时间节点往前调是有的&#xff0c;往后调也有bebug报错把sql放到数据库中&#xff0c;发现提示如截图解决办法&#xff0c;oracle中的decode()select decode(b,0,0,a/b*100) …

Java GridBagLayout 简单使用

这里只介绍了很基础布局构建及使用&#xff0c;主要是关于 GridBagLayout. 首先整套流程大概是&#xff0c; 声明一个 GridBagLayout 对象 private GridBagLayout gridBagLayoutFrame new GridBagLayout(); 然后把当前类的容器布局管理器设置为 GridBagLayout this.setLayout(…

Angular之简单的登录注册

使用Angular实现了一个简单的登录注册的功能........ 涉及到的Angular知识点很少 主要是这个功能的实现...(*^__^*) 嘻嘻…… 里面涉及到的知识点记录: 1.本地存储的操作 localStorage 获取本地存储的值 window.localStorage.getItem(key)-->value (得到的数据是字符串&qu…

微信扫码下载iosAPP

1.首先在应用宝上传你的安卓APP应用&#xff0c;AppStore已经有了APP 2.进入应用宝app应用管理中心&#xff0c;点击“微下载”&#xff0c;然后里面的微下载链接地址就可以用了&#xff0c;可以看到ios可以通过应用宝再跳到AppStore就可以实现下载了转载于:https://www.cnblog…