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")
}
}
我正在使用 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")
}
}