在我的Android项目中,我希望找到一种方法来缩写对各种语言环境敏感的数字。如果数量小于1000,则保持不变;否则,我希望数字除以1000的最大可能功率并四舍五入到小数点后两位。到目前为止,我有下面的代码,它正确地产生了输出中所述的所需结果。
public void formatNumbers() {
//Output:
//842 => 842
//24,567 => 24.57k
//356,915 => 356.92k
//7,841,234 => 7.84M
//1,982,452,873 => 1.98B
int[] i = new int[] {842, 24567, 356915, 7841234, 1982452873};
String[] abbr = new String[] {"", "k", "M", "B"};
DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.HALF_UP);
for (long i1 : i) {
int thousands = thousands(i1);
String result;
if(thousands == 0) {
result = String.valueOf(i1);
} else {
double d = (double) i1 / Math.pow(1000.0, thousands);
result = df.format(d)+abbr[thousands];
}
System.out.println(i1 + " => " + result);
}
}
public int thousands(double num) {
//returns the number of times the number can be divided by 1000
int n=0;
double comp=1000.0;
while(num>comp) {
n++;
comp*=1000.0;
}
return n;
}
我担心的是我想要一种方法来确保输出对语言环境敏感。如果我理解正确,DecimalFormat应该在适用的情况下处理诸如逗号而不是小数的约定;这让我对后缀感到担忧。虽然我的产出通常在美国被理解为偶然目的(尽管“M”在某些行业中用于表示“数千”,例如金融),而且根据我的理解,欧洲的许多地区都有基于拉丁语的语言,有许多语言环境,这是不能很好理解的。也许有一个内置函数来处理这个我无法找到的函数。提前感谢您对此任务的关注和投入。