Format number using decimal format in kotlin
Asked Answered
C

6

49

I am facing an issue where I need to do some calculations with a number like for example 5000,00 multiplied it by (1,025^3).

So in this case 5000,00 * (1,025^3) = 5385,45

So my question is, how can I format the number 5385,45 to be like 5.385,45 using decimal format maybe?

I tried by myself and I did this piece of code that outputs 5385,45 in the app but not 5.385,45

    var interestValue = (5000,00*(Math.pow(1.025,yearValue)))
    val number = java.lang.Double.valueOf(interestValue)
    val dec = DecimalFormat("#,00")
    val credits = dec.format(number)
    vValueInterest.text = credits
Cabman answered 19/12, 2018 at 9:30 Comment(2)
Possible duplicate of How to print a double with two decimals in Android?Thermosetting
https://mcmap.net/q/181786/-how-to-print-a-double-with-two-decimals-in-android-duplicateThermosetting
L
64

This is the format you need:

val dec = DecimalFormat("#,###.##")

will print:

5.384,45

if you need always exactly 2 digits after the decimal point:

val dec = DecimalFormat("#,###.00") 
Linseed answered 19/12, 2018 at 10:19 Comment(6)
0 will be printed as .00 instead of 0.00. Just use String.format("%.2f", number)Piddling
@Piddling 0 will be printed as 0. The question is not about formatting fixed decimal places but about formatting a number like 5385,45 to 5.385,45, meaning about the thousands separator.Linseed
If you need 0 to be printed as 0.00, you can use DecimalFormat("#,##0.00").Staging
Does DecimalFormat work if targeting kotlin-js?Jugulate
@Jugulate I only use Kotlin in Android app development so I can't answer your question.Linseed
After some investigation it turns out it does not, but it turns out String.format does not either, so they're about as good as each other. :) Still, you can just use "%,.2f".format(number) in this case, you get the thousands separator as well (note the , in the format string!) I'm still on the lookout for the portable way to do number formatting without reinventing the wheel.Jugulate
W
30
val num = 1.34567
val df = DecimalFormat("#.##")
df.roundingMode = RoundingMode.CEILING

println(df.format(num))

When you run the program, the output will be: 1.34

Check: https://www.programiz.com/kotlin-programming/examples/round-number-decimal

Wardship answered 19/12, 2018 at 10:25 Comment(0)
J
28

The "most Kotlin-esque" way I found to do this sort of formatting is:

"%,.2f".format(Locale.GERMAN, 1234.5678)      // => "1.234,57"
"%,.2f".format(Locale.ENGLISH, 1234.5678)     // => "1,234.57"

"%,.2f".format(1234.5678)                     // => "1,234.57" for me, in en_AU

Note though that even though this is Kotlin's own extension method on String, it still only works on the JVM.

For those looking for a multiplatform implementation (as I was), mp_stools is one option.

Jugulate answered 5/3, 2022 at 5:10 Comment(0)
W
6

I needed to do something similar but for Kotlin Multiplatform (KMM). I struggled to find a multiplatform solution so I thought I'd post the one I came up with here:

// Common
expect fun Double.formatDecimal(maxFractionDigits: Int = 2): String
// Android
import java.text.DecimalFormat

actual fun Double.formatDecimal(maxFractionDigits: Int): String =
    DecimalFormat().apply {
        isGroupingUsed = false
        minimumFractionDigits = 0
        maximumFractionDigits = maxFractionDigits
        isDecimalSeparatorAlwaysShown = false
    }.format(this) 
// iOS
import kotlinx.cinterop.convert
import platform.Foundation.NSNumber
import platform.Foundation.NSNumberFormatter
import platform.Foundation.NSNumberFormatterDecimalStyle

actual fun Double.formatDecimal(maxFractionDigits: Int): String =
    NSNumberFormatter().apply {
        minimumFractionDigits = 0u
        maximumFractionDigits = maxFractionDigits.convert()
        numberStyle = NSNumberFormatterDecimalStyle
    }.stringFromNumber(number = NSNumber(double = this)) ?: ""
Warp answered 20/7, 2023 at 10:47 Comment(0)
Y
5

Used:

%.numberf

fun main(args: Array<String>) {
var A: Double
A = readLine()!!.toDouble()
var bla = A*A
var calculator = 3.14159 * bla
println("A=%.4f".format(calculator))
}
Yamashita answered 31/7, 2020 at 20:59 Comment(0)
C
3

Try val dec = DecimalFormat("#.###,00"). For examples of DecimalFormat check this link.

Cisco answered 19/12, 2018 at 10:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.