Android - 阿拉伯语中百分比字符的错误位置

问题描述

自定义视图中,我需要为不同的语言环境绘制一个文本“100%”。

对于阿拉伯语,它应该是这样的:

Arabic 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 按原样绘制它,所以结果是错误的:

Wrong result

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%,用阿拉伯语写出%١٠٠