国际化相关类
1.java.util.Local类
Locale类的对象代表特定的地理、政治和文化地区。有三种获取Local对象的方式。
1.使用构造器
public Locale(String language,String country)
2.利用Locale常用语言环境预设的常量来创建。
Locale locale=Locale.CHINA;//获取代表中国大陆的Locale对象
3.获取此JVM当前默认的语言环境Loacle对象
Locale locale=Locale.getDefault( )
import java.util.Locale;
public class LocaleTest {
/*Locale类的三种初始化*/
/*1.利用构造器初始化*/
static Locale locale1=new Locale("zh","CN");
static Locale locale2=Locale.CHINA;
static Locale locale3=Locale.getDefault();
public static void main(String[] args){
System.out.println(locale1);
System.out.println(locale2);
System.out.println(locale3);
}
}
运行结果:
zh_CN
zh_CN
zh_CN
java.text.MessageFormat类的格式化字符串
MessageFormat提供了与语言无关的生成连接消息的方式。用来向终端用户显示信息。常用方法:
public static String format(String patten,Object...arguements)//patten:指定消息格式模式,此模式可用“{索引}”来预设占位符。arguements:消息格式模式中指定的占位符传值,它会按照占位符的索引顺序来依次传入数组中的各个元素值。
import java.text.MessageFormat;
import java.util.Date;
public class MessageFormatTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String patten="{0}程序设计语言,当前日期时间:{1}";//消息格式模式
String str=MessageFormat.format(patten, "Java",new Date());
System.out.println(str);
System.out.println(new Date());
}
}
运行结果:
Java程序设计语言,当前日期时间:18-3-27 下午2:42
Tue Mar 27 14:42:08 CST 2018
Java程序的国际化
java语言内核基于Unicode,国际化通过三个类完成。
Java.util.Locale:对应一个国家或地区的语言环境
java.text.MessageFormat:用于将消息格式化
java.util.ResourceBundle:用于加载一个资源包 表示一个资源文件的读取操作,不需要加后缀,文件后缀默认为“.properties”。常用方法:
public static final ResourceBundle getBundle(String baseName):根据本地的语言环境和指定的文件名,获取到资源包对应的ResourceBundle实例。
public static final ResourceBundle getBundle(String baseName,Locale locale):根据指定的语言环境和指定的文件名,获取到资源包对应的ResourceBundle实例。
public final String getString(String key):根据资源文件中key取得对应的value。
1.准备资源包
命令提示符输入“native2ascii.exe”将中文字符转为Unicode字符。
2.引用本地化数据
import java.text.MessageFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;
public class I18NHelloWorldTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Locale mylocale=Locale.getDefault();//取得系统默认的国家/地区语言环境
ResourceBundle bundle=ResourceBundle.getBundle("msgs", mylocale);//根据指定的国家/地区语言环境加载资源包
String msg=bundle.getString("hello");//从资源包中取得key所对应的消息
String s=MessageFormat.format(msg, new Object[]{"张三",new Date()});//为带占位符的字符串传入参数
System.out.println(s);
/*运行错误:
*Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name msgs, locale zh_CN
at java.util.ResourceBundle.throwMissingResourceException(Unknown Source)
at java.util.ResourceBundle.getBundleImpl(Unknown Source)
at java.util.ResourceBundle.getBundle(Unknown Source)
at zz.Zzz.main(Zzz.java:13) */
}
}
最近在学习ResourseBundle时遇到了“Can't find bundle for base name ”这个错误搞了很久才解决了。
我的config.properties 文件位置在 java工程 根目录下的config中;
java 工程目录结构 如下,
CheersJava(工程目录)
-------src
-------lib
-------target
-------config(config.properties在此目录下)
.classpath
解决方法:
在eclipse中 - CheersJava工程上 右键 -Properties -Java Build Path, 在Libraries选项卡中,点击 “Add Class Folder...” 选择config目录将其添加。
然后运行代码,问题解决。
运行结果:
你好,张三!今天是18-3-28 上午11:20.
用本文编辑器打开.classpath 文件,发现多了一行:<classpathentry kind="lib" path="config"/>
参考文章:http://verran.iteye.com/blog/44357
java.text.NumberFormat类的格式化数字方法
NumberFormat类是数值格式的抽象基类,此类提供了格式化和解析数值的方法。通过以下静态方法来获取NumberFormat对象。
public static final NumberFormat getNumberInstance():返回当前默认语言环境的通用数值格式
public static final NumberFormat getPercenInstance():返回当前默认语言环境的百分比格式
public static final NumberFormat getCurrencyInstance():返回当前默认语言环境的货币格式
获取对象后,调用format方法对指定的数进行格式化。
import java.text.NumberFormat;
import java.util.Locale;
public class NumberFormatTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
NumberFormat format1=NumberFormat.getNumberInstance();//当前语言的通用数值格式
String str1=format1.format(123.45);//使用format方法对数值123.45进行格式化
System.out.println(str1);//输出结果
NumberFormat format2=NumberFormat.getPercentInstance();//百分比格式
String str2=format2.format(0.235);
System.out.println(str2);
NumberFormat format3=NumberFormat.getCurrencyInstance();
String str3=format3.format(123.45);
System.out.println(str3);
/*指定地区为us*/
Locale locale=Locale.US;
NumberFormat format4=NumberFormat.getCurrencyInstance(locale);
String str4=format4.format(123.45);
System.out.println(str4);
}
}
运行结果:
123.45
24%
¥123.45
$123.45
DecimalFormat类
用户指定数字格式来显示数字
import java.text.DecimalFormat;
public class DecimalFormatTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(formatDecimal("000,000.00", 4656.23));
}
public static String formatDecimal(String pattern,double number){
DecimalFormat df=new DecimalFormat(pattern);
return df.format(number);
}
}
运行结果:
004,656.23
java.text.DateFormat类的格式化日期时间方法
DateFormat是日期/时间格式化的抽象基类,它用来格式化或解析日期或时间。子类通过以下静态方法获取。
public static final DateFormat getDateInstance()//获取日期格式器,默认语言环境的默认风格
public static final DateFormat getDateInstance(int style)//获取日期格式器,默认语言环境的指定风格(SHORT,DEFAULT,MEDIUM,LONG,FULL)
public static final DateFormat getTimeInstance()//获取时间格式器,默认语言环境的默认风格
public static final DateFormat getDateInstance(int style)//获取时间格式器,默认语言环境的指定风格(SHORT,DEFAULT,MEDIUM,LONG,FULL)
public static final DateFormat getDateTimeInstance(int style,int style)//获取日期、时间格式器,默认语言环境的指定风格(SHORT,DEFAULT,MEDIUM,LONG,FULL)
通过public Date parse(String source)throws ParseException方法,把一个字符串按默认格式或指定格式输出date对象
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
public class DateFormatTest {
public static void main(String[] args) throws ParseException {
// TODO Auto-generated method stub
// DateFormat dateformat=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.SHORT);//2018年3月27日 下午4:16
DateFormat dateformat=DateFormat.getDateTimeInstance();//2018-3-27 16:16:38
String str=dateformat.format(new Date());
System.out.println(str);
try{
Date date=dateformat.parse("2018-3-27 16:11:41");
System.out.println(date);
}catch(ParseException e){
e.printStackTrace();
}
}
}
运行结果:
2018-3-27 16:17:23
Tue Mar 27 16:11:41 CST 2018
正则表达式相关类
正则表达式描述了一种字符串匹配模式,当需要定位符合定模式的字符串时,就需要用正则表达式。如查找、替换字符串、判断邮箱地址是否合法、抓取邮箱地址等
正则表达式语法:
正则表达式由普通字符和元字符组成,它作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
元字符从功能上分为:限定符、选择匹配符、特殊字符、字符匹配符、定位符、分组组合符、反向作用符。
1.限定符
限定符 | 说明 |
* | 匹配前面的字符或子表达式零次或多次 例如:“ja*” 匹配“j”和“jaa” |
+ | 匹配前面的字符或子表达式一次或多次 例如:“ja+”与“ja”和“jaa” 匹配,但与“j”不匹配 |
? | 匹配前面的字符或子表达式零次或一次 例如:“core?”匹配“cor”或“core” |
{n} | 正好匹配n次,n为非负整数 例如:o{2}与“bob”不匹配,与“foot”匹配 |
{n,} | 至少匹配n次 例如:o{2,}与“bob”不匹配,与“foooot”匹配 0{0,}等效于o* |
{n,m} | 最少匹配n次且最多匹配m次,m、n都为非负整数,n≤m |
2.选择匹配符
“|”,用于选择匹配两个选项中的任意一个
3.特殊字符
普通字符用ASCII码或Unicode码来代表
如字母b 它的ASCII码值为98 十进制为62 所以它的ASCII码为“\x62” 它的Unicode码值为“\u0062”
如果元字符当作普通字符来使用,要使用“\”转义。“\*”匹配“*”字符
4.字符匹配符
字符匹配符用于匹配指定字符集合中的任意一个字符
\S | 匹配任何非空白字符 |
[...] | 字符集。匹配指定字符集合包含的任意一字符 例如[a,b,c]匹配a b c |
[^...] | 反向字符集。匹配指定字符集合未包含的任意一字符 例如[^a,b,c]匹配除a b c意外的任意一个字符 |
[a-z] | 字符范围,匹配指定范围内的任意一个字符 |
[^a-z] | 字符范围,匹配除指定范围外的任意一个字符 |
. | 匹配除“\n”之外的任何单字符 |
\d | 数字字符匹配 |
\D | 非数字字符匹配 |
\w | 匹配任何单词字符 |
\W | 匹配任何非单词字符 |
\s | 匹配任何空白字符 |
5.定位符
用于规定匹配模式在目标字符串中的出现位置。
^ | 匹配输入字符串开始的位置。“^”必须出现在正则表达式的最前面才起作用。 |
$ | 匹配输入字符串结尾的位置。“$”必须出现在正则表达式最前面才起作用 |
\b | 匹配一个单词边界 例如:“er\b” 匹配never 不匹配verb |
\B | 非字边界匹配 例如:“er\B” 匹配verb 不匹配never |
6.分组组合符
分组组合符就是用()将正则表达式的某一部分定义为“组”,并且将匹配这个组的字符保存到一个临时区域。用于字符提取。
(pattern):捕获性分组。将子匹配项按照从左到右的出现顺序保存在缓冲池中,编号从1开始。(dog)\1 匹配“dogdogdog”中的“dogdog”
(?:pattern):非捕获性分组。不能捕获以供使用。
(?=pattern):正向预测匹配分组。例如“windows(?=xp|2003)”正则模式,与“windows xp”和“windows 2003”中的“windows”匹配,不与“windows vista”中的“windows”匹配。
(?!pattern):负向预测匹配分组。例如“windows(?!95|98|NT)”能匹配“windows xp”中的“windows”,不能匹配“windows 95”中的windows
7.反向引用符
用于对捕获到的组进行引用的符号。用“\组编号”来引用。例如“good good study,day day up”可以用“\b([a-z]+)\1\b”来匹配。
java se中的正则表达式API
两个最终类:
Pattern:正则表达式经编译后的表现形式、模式编译器。
Matcher:通过解释指定模式对字符串进行匹配检查、模式匹配器。
Pattern类常用方法如下:
public static Pattern compile(String regex)://将给定的正则表达式进行编译,然后返回编译后的Pattern对象。
public static pattern compile(String regex,int flags)://将给定的正则表达式进行编译,然后返回编译后的Pattern对象。flags表示匹配时的选项,常用的flags参数有:CASE_INSENSITIVE:启动不区分大小写的匹配;COMMENTS:模式中允许空白和注释;MULTLINE:启动多行模式
public Matcher matcher(CharSequence input)://创建用于匹配给定输入字符序列的模式匹配器。
public static boolean matches(String regex,CharSequence input)//直接判断字符序列input是否匹配正则表达式regex。
Matcher类常用方法:
Matcher m = Pattern.compile(regex).matcher(str)
m.maches(),对整个字符串进行匹配,整个字符串都匹配才返回true.
m.lookingAt(),字符串(str)以指定模式(regex)开始返回true
m.find(),字符串(str)在任意位置指定匹配模式(regex)就返回true
正则表达式使用实例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegularExpressionTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(matchLoginname("qiujy"));
System.out.println(matchLoginname("wwwww"));
System.out.println(getFilename("c:/abc/dsd/dsd/wd/wasd/ds.txt"));
System.out.println(RegularExpressionTest.zz());
}
/*判断登录名是否合法:只有由数字字母下划线组成,长度4个以上*/
public static boolean matchLoginname(String loginname){
return Pattern.matches("\\w{4,}", loginname);
/*"\"是转义字符;正则表达式中要用"\",就要用"\\"代替。要用"\\",用"\\\\"代替。
* \w:匹配任何单词字符*/
}
//提取指定路径名中的文件名
public static String getFilename(String path){
String result="";
String regex=".+/(.+)$";
Matcher m=Pattern.compile(regex).matcher(path);
if(m.find()){
result=m.group(1);
}
return result;
}
//验证中文名是否合法
public boolean checkChineseName(String cn){
return Pattern.matches("[\\u4E00-\\u9A5]+", cn);
}
//验证E-mail地址
public boolean checkEmail(String email){
return Pattern.matches("[a-zA-Z0-9]+@[a-Za-Z0-9]+\\.[a-zA-Z0-9]", email);
}
//验证手机号
public boolean checkPhoneNumber(String num){
return Pattern.matches("^1[3568]\\d{9}", num);
}
//验证邮政编码
public boolean checkPostCode(String code){
return Pattern.matches("\\d{6}", code);
}
//字符串替换
public static String zz(){
String str="我我我要学Java";
Matcher m=Pattern.compile("(.+)\\1+").matcher(str);//匹配所有的连续重复字符串
str=m.replaceAll("$1");//把匹配到的字符串替换成第一个分组匹配的结果
return str;
}
}
运行结果:
true
true
ds.txt
我要学Java
大数字操作
在java.Math包中BigInteger和BigDecimal类提供对大数字的操作。
BigInteger代表任意精度的整数,BigDecimal代表任意精度的浮点数。
import java.math.BigDecimal;
import java.math.BigInteger;
public class BigNumberTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
/*两种构造方式 */
BigInteger b1=new BigInteger("6666666666");
BigInteger b2=BigInteger.valueOf(Long.parseLong("99999999999999"));//接受long型参数
System.out.println("和"+b1.add(b2));
System.out.println("差"+b1.subtract(b2));
System.out.println("积"+b1.multiply(b2));
System.out.println("商"+b2.divide(b1));
System.out.println("余"+b2.remainder(b1));
BigDecimal d1=new BigDecimal("4654654653463.4848494");
BigDecimal d2=new BigDecimal("4678977989879879.3654");
System.out.println("和"+d1.add(d2));
System.out.println("差"+d1.subtract(d2));
System.out.println("积"+d1.multiply(d2));
System.out.println("商"+d2.divide(d1,5,BigDecimal.ROUND_HALF_UP));
}
}
运行结果:
和100006666666665
差-99993333333333
积666666666599993333333334
商15000
余9999
和4683632644533342.8502494
差-4674323335226415.8805506
积21779026674047602808223187817.96258657076
商1005.22559