初めに
今回やりたいことは、総数や距離などで頻出するk表示やmillion表示をする時に共通化しておける拡張関数を作ることです。
仕様としては下記のとおりです
- 1000や1000000を超えていたらK、M表示にして返す
- 小数点第二位切り捨て、小数点第一位が0だった場合も切り捨て
- 100 -> 100
- 1000 -> 1k
- 1099 -> 1k
- 1100 -> 1.1k
- 1110 -> 1.1k
- 1199 -> 1.1k
- 1200 -> 1.2k
- 10000 -> 10k
- 100000 -> 100k
- 999000 -> 999k
- 1000000 -> 1M
コード
では、実際にコードを書いていきましょう
コード量自体はとても少なく、わかりやすいものとなってます。
fun Long.toCount(): String {
check(this >= 0)
return when {
this < 1_000 -> {
"$this"
}
this < 1_000_000 -> {
val kiloCalc = this / 1_000.0
val decimalKiloCount = BigDecimal.valueOf(kiloCalc)
val kiloCount = decimalKiloCount.setScale(1, RoundingMode.DOWN)
"${kiloCount.stripTrailingZeros().toPlainString()}k"
}
else -> {
val millionCalc = this / 1_000_000.0
val decimalMillionCount = BigDecimal.valueOf(millionCalc)
val millionCount = decimalMillionCount.setScale(1, RoundingMode.DOWN)
"${millionCount.stripTrailingZeros().toPlainString()}M"
}
}
}
BigDEcimal
を使っての変換関数ですね。
一度でも、数値型の変換系を実装したことある方はよくお世話になっていると思います。
アンダースコアはあまり意味はないです。
ただ、見やすいので記述しておきました。
受け取った値が自然数かどうかをチェックして、数値の大きさにより分岐先で変換をしてあげる様にしました。
受け取った数値を対応した値で割ることで小数を発生させ、それをBigDecimal
に変換し自分が扱いたい様に加工しました
最後に
今回の記事は、自分の備忘録用と言う役割が大きいので皆さんの役に立てるかは少々不安ではありますが、似た様な処理を書きたい方の少しでも手助けになれたら幸いです