编程语言
首页 > 编程语言> > 星号字母错误对齐Java

星号字母错误对齐Java

作者:互联网

当我查看带有阿拉伯语右对齐文本的列表项时,格式错误.
在所有阿拉伯语声明中,它都可以正常工作. [arWord] .25.3,但仅当文本为*时,它才看起来像这样.
结果:.22.1.*

码:

arabicFormat = String.format(new Locale(Language.Arabic.getCode(),
                    Language.Arabic.getCountry()), "%d.%d.%s",position,
                    (h.getSeq() + 1), navText);

预期:*.22.1 [左侧的星号]

结果:.22.1.*

编辑:
该问题也出现在其他字符上,例如,’.

解决方法:

这是一个非常有趣的问题.我决定继续尝试,是的,我可以在这里重复您的问题.我的看法是*不是阿拉伯文本,因此它不应用语言格式.

这是我的测试:

@Test
public void testArabicLanguage() {
    // arabic
    assertThat(toArabicLanguage("قضاة وحقوقيون يكشفون "), is("22.1.قضاة وحقوقيون يكشفون "));

    // english
    assertThat(toArabicLanguage("hey"), is("22.1.hey"));

    // chinese
    assertThat(toArabicLanguage("现在进入"), is("22.1.现在进入"));

    // symbol
    assertThat(toArabicLanguage("*"), is("22.1.*"));
}

private String toArabicLanguage(String navText) {
    String s = String.format(new Locale("ar", "DZ"), "%d.%d.%s", 22, 1, navText);
    System.out.println(s);
    return s;
}

当我执行以上测试时,一切都通过了.

但是,当我直接在IntelliJ中查看控制台打印输出和测试时,我看到的是从右到左显示的阿拉伯文本.

每当我在此处复制和粘贴文本时,它始终从左到右显示.

这是控制台打印输出:-

22.1.قضاة وحقوقيون يكشفون 
22.1.hey
22.1.现在进入
22.1.*

现在,将其与我在IntelliJ中看到的进行比较,阿拉伯语文本从右至左显示:-

更新

如果只想始终先显示navText,则可以使用language-detection库来显示.该库似乎需要使用jsonic库才能起作用.是的,我知道它是日语的,而且我自己也不阅读日语…只需找到jsonic 1.3(1.3.0)并下载即可.

这样,您可以执行以下操作:

public class MyTest {

    // language-detection zip file comes with a `profile` dir... just point to it.
    @Before
    public void setup() {
        try {
            DetectorFactory.loadProfile("/path/to/language-detection/profiles");
        }
        catch (LangDetectException e) {
            fail("Can't locate the language profiles");
        }
    }

    @Test
    public void testArabicLanguage() {
        // arabic
        assertThat(toArabicLanguage("قضاة وحقوقيون يكشفون "), is("22.1.قضاة وحقوقيون يكشفون "));

        // english
        assertThat(toArabicLanguage("hey"), is("hey.22.1"));

        // chinese
        assertThat(toArabicLanguage("现在进入"), is("现在进入.22.1"));

        // symbol
        assertThat(toArabicLanguage("*"), is("*.22.1"));
    }

    private String toArabicLanguage(String navText) {
        boolean isArabicLanguage = false;

        try {
            Detector detector = DetectorFactory.create();
            detector.append(navText);

            isArabicLanguage = detector.detect().equals("ar");
        }
        catch (LangDetectException e) {
            // `*` will throw this exception:-
            // "com.cybozu.labs.langdetect.LangDetectException: no features in text"
            //
            // so, just catch it and treat it as non-Arabic language.
        }

        if (isArabicLanguage) {
            return String.format(new Locale("ar", "DZ"), "%d.%d.%s", 22, 1, navText);
        }
        else {
            return String.format("%s.%d.%d", navText, 22, 1);
        }
    }
}

请记住,此解决方案有些过分,可能会对非阿拉伯语言产生意想不到的副作用.

标签:string-formatting,string,java
来源: https://codeday.me/bug/20191030/1964202.html