android 解决String.format多语言存在的问题

作者: cnbzlj 发布时间: 2019-09-24 浏览: 3114 次 编辑

今天,简单讲讲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多语言存在的问题就讲完了。

就这么简单。