I want to use bignumber.js in kotlin. Import: ``...
# javascript
r
I want to use bignumber.js in kotlin. Import:
Copy code
val jsMain by getting {
            dependencies {
                implementation(npm("bignumber.js", "9.0.2"))
            }
        }
Declaration:
Copy code
@JsModule("bignumber.js")
@JsNonModule
external class BigNumber(raw: String) {

    companion object {
        var ROUND_UP: Number /* 0 */
        var ROUND_DOWN: Number /* 1 */
        var ROUND_CEIL: Number /* 2 */
        var ROUND_FLOOR: Number /* 3 */
        var ROUND_HALF_UP: Number /* 4 */
        var ROUND_HALF_DOWN: Number /* 5 */
        var ROUND_HALF_EVEN: Number /* 6 */
        var ROUND_HALF_CEIL: Number /* 7 */
        var ROUND_HALF_FLOOR: Number /* 8 */

        fun config(): Config
        fun set(obj: Config): Config
        fun clone(obj: Config = definedExternally): Any
    }

    interface Config {
        var DECIMAL_PLACES: Number?
            get() = definedExternally
            set(value) = definedExternally
        var ROUNDING_MODE: Number? /* 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 */
            get() = definedExternally
            set(value) = definedExternally
        var EXPONENTIAL_AT: dynamic /* Number? | JsTuple<Number, Number> */
            get() = definedExternally
            set(value) = definedExternally
        var RANGE: dynamic /* Number? | JsTuple<Number, Number> */
            get() = definedExternally
            set(value) = definedExternally
        var CRYPTO: Boolean?
            get() = definedExternally
            set(value) = definedExternally
        var MODULO_MODE: Number? /* 0 | 1 | 3 | 6 | 9 */
            get() = definedExternally
            set(value) = definedExternally
        var POW_PRECISION: Number?
            get() = definedExternally
            set(value) = definedExternally
        var FORMAT: Format?
            get() = definedExternally
            set(value) = definedExternally
        var ALPHABET: String?
            get() = definedExternally
            set(value) = definedExternally
    }

    interface Format {
        var prefix: String?
            get() = definedExternally
            set(value) = definedExternally
        var decimalSeparator: String?
            get() = definedExternally
            set(value) = definedExternally
        var groupSeparator: String?
            get() = definedExternally
            set(value) = definedExternally
        var groupSize: Number?
            get() = definedExternally
            set(value) = definedExternally
        var secondaryGroupSize: Number?
            get() = definedExternally
            set(value) = definedExternally
        var fractionGroupSeparator: String?
            get() = definedExternally
            set(value) = definedExternally
        var fractionGroupSize: Number?
            get() = definedExternally
            set(value) = definedExternally
        var suffix: String?
            get() = definedExternally
            set(value) = definedExternally
    }

    fun plus(number: BigNumber): BigNumber
    fun minus(number: BigNumber): BigNumber
    fun multipliedBy(number: BigNumber): BigNumber
    fun dividedBy(number: BigNumber): BigNumber
    fun modulo(number: BigNumber): BigNumber
    fun comparedTo(number: BigNumber): Number?
    fun toString(base: Int): String
}
Other methods work well except
set
and
clone
.
Copy code
@Test
    fun testConfig() {
        println(BigNumber.config().DECIMAL_PLACES)
        BigNumber.set(object : BigNumber.Config {
            override var DECIMAL_PLACES: Number? = 3
        })
        println(BigNumber.config().DECIMAL_PLACES)
    }
the
set
method has no effect. The output is like the following:
Copy code
> Task :jsBrowserTest
[log] 20
[log] 20
Is there anyone can tell me why the
set
method doesn't work and how can I use
clone
method?
b
Can you post how their code looks like in ts/js?
Here
b
Jesus... That one messy js... Better look here -
set
is declared as static
r
I declare the
set
method in
companion object
, is it wrong?
b
I think the problem is that you're passing in non-external anonymous object value here
Copy code
BigNumber.set(object : BigNumber.Config {
            override var DECIMAL_PLACES: Number? = 3
        })
Try constructing
Config
via js api
Copy code
js("{}").unsafeCast<Config>().apply {
  ...
}
r
Wow, it works, thanks so much.
Another question: in JS,
clone
method will return a new constructor to create BigNumber with specific BigNumber. In Kotlin, how can I use
clone
?
b
fun clone(obj: Config = definedExternally): dynamic
is the easies way around. To make it typesafe you could try
Copy code
fun clone(obj: Config = definedExternally): (BugNumber.Value, Number?) -> BigNumber
Note how you miss out on being able to specify constructor arg names and default values. Unfortunatelly this is not supported in lambda type declarations
r
Ok, thanks so much, I’ll try it later