schedule2019-09-11

【Kotlin】桁区切りと小数桁数を指定できるフォーマッター

数値を見やすく表示するため3桁ずつカンマ区切り小数桁数を指定できるような書き方を紹介する。

コード

"%,.2f"で書ける。

// 実数型
val num: Double = 1234567.1234567;
println("%,.2f".format(num)) // 1,234,567.12

カンマ区切りについて

3桁ずつカンマ区切りにフォーマットしたいときは、"%,d"とカンマを付ける。

// 整数型
val num1: Int = 1234567;
println("%,d".format(num1)) // 1,234,567

// パディング
val num2: Int = 1234;
println("%,8d".format(num2)) //    1,234 (3つ半角スペースが付く))

// 0埋め
val num3: Int = 1234;
println("%0,8d".format(num3)) // 0001,234

パディングやゼロ埋めすると、カンマも一桁分としてカウントされるようです。

関数として使う

桁区切りと小数桁を指定して実数を表示する必要があったため作った関数。

/**
     * 桁区切りと小数桁数を整形した文字列を返す
     * 
     * @param[fractionDigits] 小数桁数
     * @param[useGroupingSeparator] 桁区切り文字を使用するか
     * @return 整形した文字列
     */
    fun formattedString(fractionDigits:Int, useGroupingSeparator: Boolean): String{
        // nullの場合は空文字
        if(this == null) return ""
        // 区切り文字を使用しない
        var format : String = "%.${fractionDigits}f"
        if(usesGroupingSeparator){
            // 区切り文字を使用する場合
            format = "%,.${fractionDigits}f"
        }
        return format.format(this)
    }

使用例

色々と事情があり、Double型を拡張して使ってみる。

var num1: Double? = 1234567.1234567
    var num2: Double? = 1234567.1234567
    var num3: Double? = null
    
    fun Double?.formattedString(fractionDigits:Int, usesGroupingSeparator: Boolean): String{
        // nullの場合は空文字
        if(this == null) return ""
        var format : String = "%.${fractionDigits}f"
        if(usesGroupingSeparator){
            format = "%,.${fractionDigits}f"
        }
        return format.format(this)
    }
    
    println("num1=" + num1.formattedString(3, true))  // num1=1,234,567.123
    println("num2=" + num2.formattedString(5, false)) // num2=1234567.12346
    println("num3=" + num3.formattedString(3, true))  // num3=

paiza.IOで張り付ければ動く。

参考