#kotlin #bigdecimal #kotlin-multiplatform
#kotlin #bigdecimal #kotlin-мультиплатформенный
Вопрос:
Я следовал руководству https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html затем я успешно создаю папки androidmain, iosmain и commonmain.
Однако, когда я хочу реализовать тип данных BigDecimal в commonmain. Это не сработает. Мне нужен десятичный набор данных для валюты.
Ответ №1:
Я знаю, что вопрос устарел, но, на случай, если кто-нибудь наткнется на эту тему, я создал библиотеку KigDecimal, которая реализует BigDecimal и BigInteger для kotlin multiplatform (для jvm и js). Библиотека распространяется совершенно свободно. Поэтому я приглашаю всех дополнять и расширять его, при желании.
На стороне jvm BigDecimal и BigInteger — это просто соответствующие типы из java. И на стороне js используетсяhttps://www.npmjs.com/package/bigdecimal.
Основной репозиторий находится здесь: https://gitflic.ru/project/mikhaylutsyury/kig-decimal
На github также есть зеркало:https://github.com/YuryMikhailuts/kig-decimal
Но зеркало иногда может немного отставать от основного хранилища.
Комментарии:
1. Приятно видеть, что кто-то использует существующую реализацию GWT. Пробовал. К сожалению, для меня отсутствует setScale с RoundingMode, добавит проблему и попытается помочь при необходимости.
Ответ №2:
BigDecimal
В общем коде Kotlin нет поддержки (пока). Вы можете взглянуть на соответствующую тему
https://discuss.kotlinlang.org/t/multiplatform-bigdecimal-implementation/5631
Вы можете создать свою собственную реализацию для такого класса с помощью ключевых слов expect
и actual
.
https://kotlinlang.org/docs/reference/platform-specific-declarations.html
Идея заключается в следующем:
- вы объявляете
expect
объявления дляBigDecimal
типа в обычном коде - вы используете
actual
аннотации на каждой платформе для предоставления конкретной реализации платформы (например, класс BigDecimal в JVM)
Ответ №3:
Я портировал BigDecimal
реализацию Android на Kotlin, что делает ее пригодной для Kotlin / Native, особенно для iOS. Однако он не может поддерживать Kotlin / JS, поскольку фактическая реализация BIGNUM зависит от BoringSSL. Код находится здесь:
https://github.com/kendy/Kotlin-Native-BigDecimal/
Пожалуйста, ознакомьтесь с README.md о том, как его создать и как его использовать.
Он имеет тот же API, что и Java BigDecimal
, поэтому вы можете использовать expect/ actual
, как предложено в другом ответе. В качестве альтернативы вы можете избежать expect/actual
и просто создать файл shared/src/iosMain/kotlin/java/math/BigDecimal.kt
в своем проекте с содержимым, подобным следующему:
package java.math
typealias BigDecimal = kendy.math.BigDecimal
[Конечно, даже при таком подходе вам все равно нужно создать BigDecimal.klib и интегрировать его в свой проект, как описано в README.md .]