Преобразование результата NumberFormat.parse () в BigDecimal - PullRequest
1 голос
/ 03 апреля 2019

Я определил formatter примерно так:

>>> import java.text.NumberFormat
>>> val formatter = NumberFormat.getInstance()

Может показаться, что результатом formatter.parse("1,000") будет Long:

>>> formatter.parse("1,000")::class
class kotlin.Long

Однако, если я пытаюсь передать его конструктору BigDecimal, я получаю сообщение об ошибке, в котором говорится, что он не соответствует ни одному из конструкторов:

>>> BigDecimal(formatter.parse("1,000"))
error: none of the following functions can be called with the arguments supplied: 
public constructor BigDecimal(p0: BigInteger!) defined in java.math.BigDecimal
public constructor BigDecimal(p0: CharArray!) defined in java.math.BigDecimal
public constructor BigDecimal(p0: Double) defined in java.math.BigDecimal
public constructor BigDecimal(p0: Int) defined in java.math.BigDecimal
public constructor BigDecimal(p0: Long) defined in java.math.BigDecimal
public constructor BigDecimal(p0: String!) defined in java.math.BigDecimal
BigDecimal(formatter.parse("1,000"))
^

Это несмотря на это

>>> formatter.parse("1,000") == 1000L
true

Есть идеи, что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

В котлин

 formatter.parse("1,000") //this result in not Long.Its is Number

, поэтому вы должны конвертировать как Long

fun main()
{
val formatter = NumberFormat.getInstance()
val result:Number=formatter.parse("1,000")
val decimal=BigDecimal(result.toLong())
println(decimal) //out put is 1000

}
1 голос
/ 03 апреля 2019

Вам нужно преобразовать ваше значение в Long перед передачей его в конструктор BigDecimal, так как это Number. Вы можете использовать .toLong() или создать функцию расширения для Number, которая возвращает BigDecimal:

fun Number.bigDecimialValue(): BigDecimal = BigDecimal(this.toLong())

...