首页 > 解决方案 > Robolectric String.format() 格式化数字时的无效行为

问题描述

在应用程序中有一个简单的代码:

String.format(Locale.getDefault(), "%d", count)

一切都很好,但是当用户在电话上选择阿拉伯语时,数字将以阿拉伯语文字格式显示(很明显)。

那么问题出在哪里?

我想用 Locale.US 替换 Locale.getDefault() 以获得“正常”数字,但也想为此编写测试。

还有一个问题。测试中的 Robolectric 显示前的数字。“3”而不是“٢”。

我的测试代码:

public class SideMenuMainContentViewTest {

    private static final String ARABIC_LANGUAGE_LOCALE_CODE = "ar-rEG";

    private SideMenuMainContentView sideMenuMainContentView;
    private AttributeSet attributeSet;

    @Before
    public void setup() {
        attributeSet = Robolectric.buildAttributeSet().build();

        sideMenuMainContentView = new SideMenuMainContentView(ApplicationProvider.getApplicationContext(), attributeSet);

    }

    @Test
    public void test_getBookedRidesCountText() {

        assertEquals("3", sideMenuMainContentView.getBookedRidesCountText(3));
    }

    @Test
    @Config(qualifiers = ARABIC_LANGUAGE_LOCALE_CODE)
    public void test_getBookedRidesCountText_notSupportedLanguage() {

        assertEquals("3", sideMenuMainContentView.getBookedRidesCountText(3));
    }
}

知道如何改变这种行为并在应用程序运行时获得测试中的文字数字吗?

标签: javaandroidunit-testingkotlinrobolectric

解决方案


要使像 ٢ 这样的东方阿拉伯数字出现在单元测试中,您可以将语言环境设置为Locale.forLanguageTag("ar-u-nu-arab")- 使用工厂方法forLanguageTag和 BCP 47 语言标记字符串“ar-u-nu-arab”,它明确指定了阿拉伯编号系统。new Locale("ar-u-nu-arab")不起作用,因为构造函数不解析编号系统。

有关 Java 8 语言环境中编号系统的更多信息,请参阅此链接:https ://www.oracle.com/technetwork/java/javase/java8locales-2095355.html#num-systems


推荐阅读