问题描述
在自定义视图中,我需要为不同的语言环境绘制一个文本“100%”。
对于阿拉伯语,它应该是这样的:
重点是百分号应该放在数字的末尾,之后。
我尝试了不同的组合来从 Java/Android 本地获取此文本:
NumberFormat.getPercentInstance().format(1)
-> ١٠٠٪
String.format("%d%s",100,DecimalFormatSymbols.getInstance().getPercent())
-> ١٠٠٪
String.format("%d%%",100)
-> ١٠٠%
等等
所以问题是所有选项都将此百分号放在字符串的开始,而不是结尾。
但是!当我调用 TextView.setText("١٠٠%")
时 - 小部件呈现得很好,如 "%١٠٠"
(我相信 TextView 内的 StaticLayout 中有一些隐藏的转换 - 基于当前的语言环境/文本上下文)。
当我调用 canvas.drawText("١٠٠%",x,y,paint);
- canvas 按原样绘制它,所以结果是错误的:
PS1. 其他实验:
String.format("%d%% %s",'م')
-> "١٠٠% م"
(正确)
String.format("%d%% %s",'م').substring(0,5)
-> "١٠٠% "
(不正确!)
PS2。我不能依赖 RTL/LTR 基础 - 一些 RTL 语言(如希伯来语)使用西方阿拉伯数字 (100%),因此简单地还原表达式也是错误的。
ps3。我现在看到的唯一方法是检查 DecimalFormatSymbols.getInstance().getPercent()
是阿拉伯百分比符号(char 1642)并手动反转表达式,但我不喜欢这种方法无论如何,这将是最后的手段。
我没有更多的想法,请帮忙!
解决方法
作为一种潜在的解决方法,也许您可以为应用中不同语言的百分比定义不同的字符串资源。
res/
values/
strings.xml: <string name="percent_format">%1$d%%</string>
values-ar/
strings.xml: <string name="percent_format">%%%1$d</string>
然后你可以写出getString(R.string.percent_format,1)
,然后用英语写出1%
,用阿拉伯语写出%١٠٠
。