我想将以下数字格式化为Android旁边的数字:
1000到1k 5821至5.8k 2000000到2m 7800000到7.8米
答案 0 :(得分:6)
尝试此方法:
对于Java
public static String formatNumber(long count) {
if (count < 1000) return "" + count;
int exp = (int) (Math.log(count) / Math.log(1000));
return String.format("%.1f %c", count / Math.pow(1000, exp),"kMGTPE".charAt(exp-1));
}
对于Kotlin(Android)
fun getFormatedNumber(count: Long): String {
if (count < 1000) return "" + count
val exp = (ln(count.toDouble()) / ln(1000.0)).toInt()
return String.format("%.1f %c", count / 1000.0.pow(exp.toDouble()), "kMGTPE"[exp - 1])
}
答案 1 :(得分:4)
尝试这个技巧:
private String numberCalculation(long number) {
if (number < 1000)
return "" + number;
int exp = (int) (Math.log(number) / Math.log(1000));
return String.format("%.1f %c", number / Math.pow(1000, exp), "kMGTPE".charAt(exp-1));
}
答案 2 :(得分:2)
这应该可以解决问题
String numberString = "";
if (Math.abs(number / 1000000) > 1) {
numberString = (number / 1000000).toString() + "m";
} else if (Math.abs(number / 1000) > 1) {
numberString = (number / 1000).toString() + "k";
} else {
numberString = number.toString();
}
答案 3 :(得分:2)
功能
public String prettyCount(Number number) {
char[] suffix = {' ', 'k', 'M', 'B', 'T', 'P', 'E'};
long numValue = number.longValue();
int value = (int) Math.floor(Math.log10(numValue));
int base = value / 3;
if (value >= 3 && base < suffix.length) {
return new DecimalFormat("#0.0").format(numValue / Math.pow(10, base * 3)) + suffix[base];
} else {
return new DecimalFormat("#,##0").format(numValue);
}
}
使用
prettyCount(789); Output: 789
prettyCount(5821); Output: 5.8k
prettyCount(101808); Output: 101.8k
prettyCount(7898562); Output: 7.9M
答案 4 :(得分:1)
从 Android 7.0 (API 24) 开始,可以使用 CompactDecimalFormat
。
例如:
private String convertNumber(int number, Locale locale) {
CompactDecimalFormat compactDecimalFormat =
CompactDecimalFormat.getInstance(locale, CompactDecimalFormat.CompactStyle.SHORT);
return compactDecimalFormat.format(number);
}
这个类也是 ICU v49 (https://unicode-org.github.io/icu-docs/apidoc/dev/icu4j/com/ibm/icu/text/CompactDecimalFormat.html) 的一部分。
此外,从 Android 11 (API 30) 开始,可以使用 NumberFormatter
。
这个类也是 ICU v60 的一部分。
答案 5 :(得分:1)
这是 Sujith Manjavana 答案的修改版本。
这里我使用了 DecimalFormat 来控制小数点后的整数。
long kil = 1000;
long meg = kil * 1000;
long gig = meg * 1000;
long ter = gig * 1000;
double bytes = 56789; // your integer. if you are using a String then --> double bytes = Double.parseDouble(56789);
DecimalFormat form = new DecimalFormat("0.0"); // you can also use 0.00 or 0.000
if ((bytes >= 0) && (bytes < kil)) {
String oneDecimal = form.format(bytes);
Toast.makeText(MainActivity.this, oneDecimal, Toast.LENGTH_LONG).show();
} else if ((bytes >= kil) && (bytes < meg)) {
String oneDecimal = form.format(bytes / kil);
Toast.makeText(MainActivity.this, oneDecimal+" K", Toast.LENGTH_LONG).show();
} else if ((bytes >= meg) && (bytes < gig)) {
String oneDecimal = form.format(bytes / meg);
Toast.makeText(MainActivity.this, oneDecimal+" M", Toast.LENGTH_LONG).show();
} else if ((bytes >= gig) && (bytes < ter)) {
String oneDecimal = form.format(bytes / gig);
Toast.makeText(MainActivity.this, oneDecimal+" B", Toast.LENGTH_LONG).show();
} else if (bytes >= ter) {
String oneDecimal = form.format(bytes / ter);
Toast.makeText(MainActivity.this, oneDecimal+" T", Toast.LENGTH_LONG).show();
} else {
String oneDecimal = form.format(bytes);
Toast.makeText(MainActivity.this, oneDecimal, Toast.LENGTH_LONG).show();
}
答案 6 :(得分:0)
这对我很有效,是Kotlin的“双重推广”。
这也不能四舍五入:
fun Double.currencyCountWithSuffix(): String {
val suffixChars = "KMGTPE"
val formatter = DecimalFormat("###.#")
formatter.roundingMode = RoundingMode.DOWN
return if (this < 1000.0) formatter.format(this)
else {
val exp = (ln(this) / ln(1000.0)).toInt()
formatter.format(this / 1000.0.pow(exp.toDouble())) + suffixChars[exp - 1]
}
}
答案 7 :(得分:0)
公共静态字符串prettyCount(Long number){
DecimalFormat df = new DecimalFormat("#.#");
String numberString = "";
if (Math.abs(number / 1000000) >= 1) {
numberString = String.valueOf( df.format(number/ 1000000.0) ) + "m";
} else if (Math.abs(number / 1000.0) >= 1) {
numberString = String.valueOf( df.format(number / 1000.0) ) + "k";
} else {
numberString = number.toString();
}
return numberString;
}
答案 8 :(得分:0)
// Kotlin 版本
fun countviews(count:Long): String{
val array = arrayOf(' ', 'k', 'M', 'B', 'T', 'P', 'E')
val value = Math.floor(Math.log10(count.toDouble())).toInt()
val base = value / 3
if (value >= 3 && base < array.size) {
return DecimalFormat("#0.0").format(count/ Math.pow(10.0, (base * 3).toDouble())) + array[base]
} else {
return DecimalFormat("#,##0").format(count)
}
}