在Android中,如果将字符串与整数连接起来,整数是本地化的吗?

时间:2016-08-18 11:51:21

标签: android localization

我有一个免费的Android应用程序,已超出原始的预期用户群。我遇到了一个实例,其中这种String.format生成了一个无效的SQL字符串:

String sql = String.format ("SELECT name from customers where cust_id=%d", cust_id);

肯定会导致问题的一种情况是用户的本地化是针对阿拉伯语的,因此客户ID以阿拉伯字符表示。

我解决了这个特殊的问题:

String sql = String.format (Locale.ENGLISH, "SELECT name from customers where cust_id=%d", cust_id);

延迟找到解决方案的原因是,因为它是免费的应用程序,大多数人都没有报告问题 - 他们只是停止使用应用程序:我只能从崩溃日志中找到答案。此外,本地化的本质似乎取决于所选语言和Android的版本......并且应用程序一直支持V2.1。我已经检测到两种不同类型的阿拉伯语,另一种(我没有识别语言)将数字本地化为问号。

我的问题是使用串联生成sql查询的语句是否会出现类似的问题,如下所示:

String sql = "SELECT name from customers where cust_id=" + cust_id;

我的大多数查询都是这样的,所以检查和更改是一项很大的工作。我可以根据经验对当前版本进行测试,但是前一个和未来版本如何呢?

2 个答案:

答案 0 :(得分:0)

没有字符串连接不会对本地化进行任何更改,只有字符串格式可以。

答案 1 :(得分:0)

整数不保存任何本地化信息(因为它是原语),问题在于您的String.format调用。

您使用了String.format:

/etc/systemd/logind.conf

Android文档说明了这一点:

  

String sql = String.format ("SELECT name from customers where cust_id=%d", cust_id);

     

使用指定的格式字符串和参数返回格式化字符串。   始终使用的语言环境是String format (String format, Object... args)返回的语言环境。

指定no locale将始终导致字符串的本地化为默认值(在客户的情况下,这是阿拉伯语)。 根据Android文档,还有第二个采用语言环境的方法声明:

  

Locale.getDefault()

     

使用指定的语言环境,格式字符串和参数返回格式化字符串。

     

[...] 如果l为null,则不应用本地化。

所以你的解决方案是修改你的电话:

String format (Locale l, String format, Object... args)

当然,您也可以将调用更改为简单的字符串连接(这可能是SQL查询的首选方式):

String sql = String.format (null, "SELECT name from customers where cust_id=%d", cust_id);

来源:https://developer.android.com/reference/java/lang/String.html