LargeValueFormatter 看起来不适合语言环境英语(澳大利亚)

LargeValueFormatter looks to be broken for locale English(Australia)

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

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

设备:[模拟器,三星 S7,Moto Z] Android 版本 [8, 9] 库版本 (v 3.0.3)

是的,因为区域设置问题。 "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;
}

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

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