今天,简单讲讲android里如何解决String.format在切换语言时存在的问题。
之前,我写过一篇博客,讲关于String.format的基本使用,大家如果没有看过,建议看看或者去网上查找资料。但是昨天,发现当手机切换成阿拉伯语时,String.format格式化的数据是一串奇怪的字符串。于是在网上查找资料,最终解决了问题。这里记录一下。
这里还是先回顾一下String.format的基本使用:
示例
常规类型的格式化
String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处。format()方法有两种重载形式。
- format(String format, Object... args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字符串。
- format(Locale locale, String format, Object... args) 使用指定的语言环境,制定字符串格式和参数生成格式化的字符串。
显示不同转换符实现不同数据类型到字符串的转换,如图所示。
转 换 符 | 说 明 | 示 例 |
%s | 字符串类型 | "mingrisoft" |
%c | 字符类型 | 'm' |
%b | 布尔类型 | true |
%d | 整数类型(十进制) | 99 |
%x | 整数类型(十六进制) | FF |
%o | 整数类型(八进制) | 77 |
%f | 浮点类型 | 99.99 |
%a | 十六进制浮点类型 | FF.35AE |
%e | 指数类型 | 9.38e+5 |
%g | 通用浮点类型(f和e类型中较短的) | |
%h | 散列码 | |
%% | 百分比类型 | % |
%n | 换行符 | |
%tx | 日期与时间类型(x代表不同的日期与时间转换符 |
我之前使用的是String format(String format, Object... args)这个函数,我现在来看看源码:
public static String format(String format, Object... args) { return format(Locale.getDefault(), format, args); }
可以看见String format(String format, Object... args)最终还是调用了format(Locale locale, String format, Object... args) 这个函数,不过语言是使用手机默认的语言,所以当切换成阿拉伯语时,出现了一串阿拉伯字符串。但是我需要的是英文的字符串,那该怎么办呢?
这个我们可以指定格式化的Locale 为英语,就可以解决这个问题。如
String.format(Locale.ENGLISH,"%04d%02d%02d %02d:%02d:00", Integer.valueOf(myYear), Integer.valueOf(myMonth), Integer.valueOf(myDay), Integer.valueOf(myHour), Integer.valueOf(myMinute));这样无论手机切换成什么语言,都格式化成英语的字符串。
接下来看看format(Locale locale, String format, Object... args) 的源码:
public static String format(Locale locale, String format, Object... args) { if (format == null) { throw new NullPointerException("format == null"); } int bufferSize = format.length() + (args == null ? 0 : args.length * 10); Formatter f = new Formatter(new StringBuilder(bufferSize), locale); return f.format(format, args).toString(); }
其实String.format(Locale locale, String format, Object... args)内部使用的是Formatter这个类进行格式化,这里首先根据参数的数量创建不同bufferSize(大小)的Formatter,同时指定了Formatter格式化的语言,然后调用f.format(format, args).toString()格式化字符串。关于Formatter,我会写一篇博客专门讲这个类。大家也可以自己去网上查找资料。
android 解决String.format多语言存在的问题就讲完了。
就这么简单。