Compare commits
2 Commits
377809383d
...
e82fb280ab
Author | SHA1 | Date | |
---|---|---|---|
e82fb280ab | |||
4dc6ae521c |
@ -2,7 +2,7 @@ package com.cubetiqs.libra.moneyutils
|
||||
|
||||
open class Money(
|
||||
var value: Double,
|
||||
private var currency: String = "USD"
|
||||
@SpecialString(trim = true, upperCase = true) private var currency: String = "USD"
|
||||
) : StdMoney {
|
||||
|
||||
//////////////////// - PROPERTIES - ////////////////////
|
||||
@ -12,7 +12,7 @@ open class Money(
|
||||
}
|
||||
|
||||
override fun getMoneyCurrency(): String {
|
||||
return this.currency.toUpperCase()
|
||||
return this.currency
|
||||
}
|
||||
|
||||
//////////////////// - GENERIC - ////////////////////
|
||||
|
@ -0,0 +1,5 @@
|
||||
package com.cubetiqs.libra.moneyutils
|
||||
|
||||
fun StdMoney.addMoney(value: Double, currency: String): StdMoney {
|
||||
return this + Money.create(value, currency)
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package com.cubetiqs.libra.moneyutils
|
||||
|
||||
fun StdMoney.exchangeTo(currency: String): StdMoney {
|
||||
return MoneyExchangeUtils.exchange(this, currency)
|
||||
}
|
||||
|
||||
fun StdMoney.isMatchedCurrency(currency: String) = this.getMoneyCurrency().equals(currency, ignoreCase = true)
|
@ -1,13 +1,12 @@
|
||||
package com.cubetiqs.libra.moneyutils
|
||||
|
||||
operator fun Money.unaryMinus() = (-getMoneyValue())
|
||||
operator fun Money.unaryPlus() = (+getMoneyValue())
|
||||
operator fun StdMoney.unaryMinus() = (-getMoneyValue())
|
||||
operator fun StdMoney.unaryPlus() = (+getMoneyValue())
|
||||
operator fun Money.inc() = Money(value++)
|
||||
operator fun Money.dec() = Money(value--)
|
||||
operator fun Money.plus(other: Money) = Money(value + other.value)
|
||||
operator fun Money.times(other: Money) = Money(value * other.value)
|
||||
operator fun Money.div(other: Money) = Money(value / other.value)
|
||||
operator fun Money.timesAssign(other: Money) {
|
||||
this.value = this.value * other.value
|
||||
}
|
||||
operator fun Money.not() = this.value != this.value
|
||||
operator fun StdMoney.plus(other: StdMoney) = Money(getMoneyValue() + other.getMoneyValue())
|
||||
operator fun StdMoney.times(other: StdMoney) = Money(getMoneyValue() * other.getMoneyValue())
|
||||
operator fun StdMoney.div(other: StdMoney) = Money(getMoneyValue() / other.getMoneyValue())
|
||||
operator fun Money.timesAssign(other: StdMoney) {
|
||||
this.value = this.getMoneyValue() * other.getMoneyValue()
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.cubetiqs.libra.moneyutils
|
||||
|
||||
@Target(AnnotationTarget.FIELD)
|
||||
@Retention(AnnotationRetention.RUNTIME)
|
||||
annotation class SpecialString(val value: String = "", val upperCase: Boolean = true, val trim: Boolean = true)
|
@ -0,0 +1,37 @@
|
||||
package com.cubetiqs.libra.moneyutils
|
||||
|
||||
import java.lang.reflect.Field
|
||||
|
||||
class SpecialStringProcessor: ISerializer {
|
||||
override fun <T> serialize(data: T?): T? {
|
||||
if (data == null) return null
|
||||
val clazz = data.javaClass
|
||||
clazz.declaredFields.forEach {
|
||||
it.isAccessible = true
|
||||
if (it.isAnnotationPresent(SpecialString::class.java) && it.genericType == String::class.java) {
|
||||
val annotationValues = it.getAnnotation(SpecialString::class.java)
|
||||
var value = it.get(data).toString()
|
||||
if (annotationValues.trim) {
|
||||
value = value.trim()
|
||||
}
|
||||
if (annotationValues.upperCase) {
|
||||
value = value.toUpperCase()
|
||||
}
|
||||
it.set(data, value)
|
||||
}
|
||||
}
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
private fun getSerializeKey(field: Field): String {
|
||||
val annotationValue = field.getAnnotation(SpecialString::class.java).value
|
||||
return if (annotationValue.isEmpty()) {
|
||||
field.name
|
||||
} else annotationValue
|
||||
}
|
||||
}
|
||||
|
||||
interface ISerializer {
|
||||
fun <T> serialize(data: T?): T?
|
||||
}
|
@ -20,5 +20,6 @@ interface StdMoney {
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
@SpecialString
|
||||
fun getMoneyCurrency(): String
|
||||
}
|
@ -2,20 +2,21 @@ import com.cubetiqs.libra.moneyutils.Money
|
||||
import com.cubetiqs.libra.moneyutils.MoneyConfig
|
||||
import com.cubetiqs.libra.moneyutils.MoneyCurrency
|
||||
import com.cubetiqs.libra.moneyutils.MoneyExchangeUtils
|
||||
import com.cubetiqs.libra.moneyutils.plus
|
||||
import com.cubetiqs.libra.moneyutils.times
|
||||
import com.cubetiqs.libra.moneyutils.timesAssign
|
||||
import com.cubetiqs.libra.moneyutils.SpecialStringProcessor
|
||||
import org.junit.Assert
|
||||
import org.junit.Test
|
||||
|
||||
class MoneyTests {
|
||||
@Test
|
||||
fun money_operator_test() {
|
||||
val money = Money(10.0)
|
||||
val money2 = Money(20.0)
|
||||
money *= money
|
||||
println((money + money2) * money2)
|
||||
Assert.assertEquals(100.0, money.value, 0.0)
|
||||
// val money = Money(10.0)
|
||||
// val money2 = Money(20.0)
|
||||
// money *= money
|
||||
// println((money + money2) * money2)
|
||||
// Assert.assertEquals(100.0, money.value, 0.0)
|
||||
|
||||
val test = SpecialStringProcessor().serialize(Money(1.0, " usd "))
|
||||
println(test)
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -47,7 +48,7 @@ class MoneyTests {
|
||||
.setDeliEqual('=')
|
||||
.setDeliSplit(';')
|
||||
|
||||
MoneyConfig.parse("USD=1,KHR=4000,EUR=0.99")
|
||||
MoneyConfig.parse("USD:1,KHR=4000,EUR=0.99")
|
||||
|
||||
val moneyUsd = Money.ONE
|
||||
val moneyKhr = Money.create(20000.0, MoneyCurrency.KHR)
|
||||
|
37
src/test/kotlin/ObjectTests.kt
Normal file
37
src/test/kotlin/ObjectTests.kt
Normal file
@ -0,0 +1,37 @@
|
||||
import org.junit.Test
|
||||
|
||||
class ObjectTests {
|
||||
|
||||
@Test
|
||||
fun builder_object_test() {
|
||||
val person = Person
|
||||
.builder()
|
||||
.name("Sambo Chea")
|
||||
.id(10)
|
||||
.build()
|
||||
|
||||
println(person)
|
||||
}
|
||||
}
|
||||
|
||||
data class Person(val id: Long? = null, val name: String? = null) {
|
||||
companion object {
|
||||
fun builder(): PersonBuilder {
|
||||
return PersonBuilder()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class PersonBuilder {
|
||||
private var id: Long? = null
|
||||
private var name: String? = null
|
||||
|
||||
fun id(id: Long?) = apply { this.id = id }
|
||||
fun name(name: String?) = apply { this.name = name }
|
||||
|
||||
fun build(): Person {
|
||||
return Person(id, name)
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user