LargeValueFormatter在语言环境英语(澳大利亚)中似乎被破坏了

时间:2018-09-21 05:48:22

标签: android mpandroidchart

我正在使用LargeValueFormatter格式化Y轴值。它适用于除英语(澳大利亚)以外的所有语言环境。 例如,对于所有其他语言环境,它会返回4K,8K,16K等值,但是当我将语言环境更改为英语(澳大利亚)时,它会返回与4e03、8e03、16e3 ...相同的值。

我该如何解决?我的疑问在于DecimalFormat实例,因为它在内部使用语言环境。

设备:[仿真器,三星S7,Moto Z] Android版本[8,9] 图书馆版本(v 3.0.3)

2 个答案:

答案 0 :(得分:1)

是因为区域设置问题。 “ E”变为小写,则正则表达式不再起作用。

在等待来自MPAndroidChart的正式补丁时,您可以通过创建自己的LargeValueFormatter(与原始源代码类似,但在构造函数中进行小的修改)来临时修复:

public LargeValueFormatter() {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);
    mFormat  = (DecimalFormat)nf;
    mFormat.applyPattern("###E00");
}

或更改makePretty():

private String makePretty(double number) {

    String r = mFormat.format(number);

    int numericValue1 = Character.getNumericValue(r.charAt(r.length() - 1));
    int numericValue2 = Character.getNumericValue(r.charAt(r.length() - 2));
    int combined = Integer.valueOf(numericValue2 + "" + numericValue1);

    r = r.replaceAll("E|e[0-9][0-9]", SUFFIX[combined / 3]);

    while (r.length() > MAX_LENGTH || r.matches("[0-9]+\\.[a-z]")) {
        r = r.substring(0, r.length() - 2) + r.substring(r.length() - 1);
    }

    return r;
}

答案 1 :(得分:0)

@anhtuannd的答案对我有用。如果您使用的是Kotlin,请将主要构造函数更改为:

init {
        mFormat = (NumberFormat.getNumberInstance(Locale.US) as DecimalFormat).also {
            it.applyPattern("###E00")
        }
    }