我有以下代码:
int color = 0;
int number = 0;
// ...
s = String.format("%dproduct%d", color, number);
这在我的电脑和Android设备上运行良好。我得到像0product0
等字符串。
但在生产中,在用户的Android设备上,我得到的字符串如下:
٠product٠
٠product١
٠product٢
٠product٣
٠product٤
从数字开始时,String.format()不能正常工作吗?
答案 0 :(得分:4)
你得到的字符串是"正确"对于阿拉伯语区域设置,例如UTF-8双字节值d9 a0
(由Andy发布)对Unicode代码点U+0660
进行编码,即ARABIC-INDIC DIGIT ZERO
。
由于您的输出的其余部分不依赖于区域设置,您可能也希望美国区域设置中显示的数字,如Hitesh Sarsava所建议的那样:
String s = String.format(Locale.US, "%dproduct%d", color, number);
答案 1 :(得分:3)
此处的变量是默认的Locale,在设备上可能有所不同。
为了帮助解释,这是您发布的字符串输出的十六进制视图:
d9 a0 70 72 6f 64 75 63 74 d9 a0
在我的电脑(UTF-8)上显示为:
٠product٠
请遵循其他答案中的建议,并继续研究" Locale"。
了解其他设备无法更具体的区域可能会有所帮助。
这是一个有趣的问题。
您还可以尝试使用“自定义区域设置”在自己的模拟器上重新创建此项。预先安装在模拟器上的应用程序。我无法肯定地说你支持所需的语言。
基于@RalfKleberhoff的出色调查,我能够使用“自定义区域设置”在模拟器上重新创建此项目。预先安装的应用并将其更改为“' ar' locale(列表中的第一个)。 (主要是为了我自己的教育 - 但也可能对你有用。)
如果你编写了类似的东西,那么更具启发性(?)是什么:
String.format("0product0")
即。没有格式化 - 它适用于' ar'显示" en"数字,所以似乎问题仅限于此功能的格式化("%...")方面 - 清楚如泥。
答案 2 :(得分:2)
使用这样的格式:
String s = String.format(Locale.getDefault(), "%dproduct%d", color, number);
或按照您的要求使用:
String s = String.format(Locale.US, "%dproduct%d", color, number);