如何在Android studio中格式化1200到1.2k

时间:2017-01-25 19:00:02

标签: android android-studio

我想将以下数字格式化为Android旁边的数字:

1000到1k 5821至5.8k 2000000到2m 7800000到7.8米

9 个答案:

答案 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)
        }
    }