Как вывести число с двумя знаками после запятой
import java.util.Locale
fun main() {
val price = 12.3456
println("%.2f".format(Locale.US, price))
println("%.0f".format(Locale.US, price))
println("%8.3f|".format(Locale.US, 3.14159))
println("%05d".format(42))
println("%s scored %d".format("Anna", 95))
}12.35
12
3.142|
00042
Anna scored 95"шаблон".format(значения) подставляет значения на места %…:
| Запись | Что значит |
|---|---|
%.2f | дробное число, 2 знака после точки, с округлением |
%8.3f | 3 знака, вся запись шириной 8 символов — недостающее слева заполняется пробелами |
%d | целое число |
%05d | целое шириной 5, слева нули |
%s | строка или любое значение |
Запятая вместо точки
Locale — язык и страна, по правилам которых оформляются числа. Без него берутся настройки системы:
fun main() {
println("%.2f".format(12.3456))
}На компьютере с русскими региональными настройками это 12,35, с английскими — 12.35. Если формат важен — для файлов, обмена данными, проверки задач, — указывайте Locale.US явно, как в первом примере (и import java.util.Locale в начале файла). Для вывода человеку на русском запятая как раз уместна.
Округлить, а не только вывести
format меняет только вид, само число остаётся прежним. Если округлённое значение нужно для расчётов:
import kotlin.math.roundToInt
fun main() {
val x = 12.3456
println(x.roundToInt())
val twoDigits = Math.round(x * 100) / 100.0
println(twoDigits)
println(Math.round(2.5 * 100) / 100.0)
}12
12.35
2.5roundToInt()— до целого;Math.round(x * 100) / 100.0— до двух знаков. Но выводится такое число без лишних нулей:2.5, а не2.50. Для вывода ровно двух знаков всё равно нуженformat.
Подводные камни
- Дробные числа хранятся приближённо, поэтому
println(0.1 + 0.2)выводит0.30000000000000004. Для денег удобнее считать в копейках целыми числами (Long) или братьjava.math.BigDecimal. %d— только для целых."%d".format(2.5)падает с ошибкойIllegalFormatConversionException.- Знак процента в шаблоне —
%%:"%d%%".format(50)даёт50%.