Replace shortNumber() with formatNumber() (#3519)
formatNumber() was existing code to show numbers with suffixes like K, M, etc, so re-use that code and delete shortNumber(). Update the tests to (a) test formatNumber(), and (b) be parameterised.
This commit is contained in:
parent
dd1020e48a
commit
071e00774e
5 changed files with 78 additions and 78 deletions
|
|
@ -397,7 +397,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
|
|||
if (replyCountLabel == null) return;
|
||||
|
||||
if (fullStats) {
|
||||
replyCountLabel.setText(NumberUtils.shortNumber(repliesCount));
|
||||
replyCountLabel.setText(NumberUtils.formatNumber(repliesCount, 1000));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -114,11 +114,11 @@ public class StatusViewHolder extends StatusBaseViewHolder {
|
|||
}
|
||||
|
||||
protected void setReblogsCount(int reblogsCount) {
|
||||
reblogsCountLabel.setText(NumberUtils.shortNumber(reblogsCount));
|
||||
reblogsCountLabel.setText(NumberUtils.formatNumber(reblogsCount, 1000));
|
||||
}
|
||||
|
||||
protected void setFavouritedCount(int favouritedCount) {
|
||||
favouritedCountLabel.setText(NumberUtils.shortNumber(favouritedCount));
|
||||
favouritedCountLabel.setText(NumberUtils.formatNumber(favouritedCount, 1000));
|
||||
}
|
||||
|
||||
protected void hideStatusInfo() {
|
||||
|
|
|
|||
|
|
@ -20,10 +20,8 @@ import com.keylesspalace.tusky.R
|
|||
import com.keylesspalace.tusky.databinding.ItemTrendingCellBinding
|
||||
import com.keylesspalace.tusky.entity.TrendingTagHistory
|
||||
import com.keylesspalace.tusky.interfaces.LinkListener
|
||||
import com.keylesspalace.tusky.util.formatNumber
|
||||
import com.keylesspalace.tusky.viewdata.TrendingViewData
|
||||
import java.text.NumberFormat
|
||||
import kotlin.math.ln
|
||||
import kotlin.math.pow
|
||||
|
||||
class TrendingTagViewHolder(
|
||||
private val binding: ItemTrendingCellBinding
|
||||
|
|
@ -70,25 +68,4 @@ class TrendingTagViewHolder(
|
|||
itemView.contentDescription =
|
||||
itemView.context.getString(R.string.accessibility_talking_about_tag, totalAccounts, tag)
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val numberFormatter: NumberFormat = NumberFormat.getInstance()
|
||||
private val ln_1k = ln(1000.0)
|
||||
|
||||
/**
|
||||
* Format numbers according to the current locale. Numbers < min have
|
||||
* separators (',', '.', etc) inserted according to the locale.
|
||||
*
|
||||
* Numbers > min are scaled down to that by multiples of 1,000, and
|
||||
* a suffix appropriate to the scaling is appended.
|
||||
*/
|
||||
private fun formatNumber(num: Long, min: Int = 100000): String {
|
||||
if (num < min) return numberFormatter.format(num)
|
||||
|
||||
val exp = (ln(num.toDouble()) / ln_1k).toInt()
|
||||
|
||||
// TODO: is the choice of suffixes here locale-agnostic?
|
||||
return String.format("%.1f %c", num / 1000.0.pow(exp.toDouble()), "KMGTPE"[exp - 1])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,25 +2,27 @@
|
|||
|
||||
package com.keylesspalace.tusky.util
|
||||
|
||||
import java.text.DecimalFormat
|
||||
import java.text.NumberFormat
|
||||
import kotlin.math.abs
|
||||
import kotlin.math.floor
|
||||
import kotlin.math.log10
|
||||
import kotlin.math.ln
|
||||
import kotlin.math.pow
|
||||
import kotlin.math.sign
|
||||
|
||||
val shortLetters = arrayOf(' ', 'K', 'M', 'B', 'T', 'P', 'E')
|
||||
private val numberFormatter: NumberFormat = NumberFormat.getInstance()
|
||||
private val ln_1k = ln(1000.0)
|
||||
|
||||
fun shortNumber(number: Number): String {
|
||||
val numberAsDouble = number.toDouble()
|
||||
val nonNegativeValue = abs(numberAsDouble)
|
||||
var sign = ""
|
||||
if (numberAsDouble.sign < 0) { sign = "-" }
|
||||
val value = floor(log10(nonNegativeValue)).toInt()
|
||||
val base = value / 3
|
||||
if (value >= 3 && base < shortLetters.size) {
|
||||
return DecimalFormat("$sign#0.0").format(nonNegativeValue / 10.0.pow((base * 3).toDouble())) + shortLetters[base]
|
||||
} else {
|
||||
return DecimalFormat("$sign#,##0").format(nonNegativeValue)
|
||||
}
|
||||
/**
|
||||
* Format numbers according to the current locale. Numbers < min have
|
||||
* separators (',', '.', etc) inserted according to the locale.
|
||||
*
|
||||
* Numbers >= min are scaled down to that by multiples of 1,000, and
|
||||
* a suffix appropriate to the scaling is appended.
|
||||
*/
|
||||
fun formatNumber(num: Long, min: Int = 100000): String {
|
||||
val absNum = abs(num)
|
||||
if (absNum < min) return numberFormatter.format(num)
|
||||
|
||||
val exp = (ln(absNum.toDouble()) / ln_1k).toInt()
|
||||
|
||||
// Suffixes here are locale-agnostic
|
||||
return String.format("%.1f%c", num / 1000.0.pow(exp.toDouble()), "KMGTPE"[exp - 1])
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue