Как использовать BigDecimal в мультиплатформенной Kotlin?

#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 .]