Compare commits
2 Commits
377809383d
...
e82fb280ab
Author | SHA1 | Date | |
---|---|---|---|
e82fb280ab | |||
4dc6ae521c |
@ -2,7 +2,7 @@ package com.cubetiqs.libra.moneyutils
|
|||||||
|
|
||||||
open class Money(
|
open class Money(
|
||||||
var value: Double,
|
var value: Double,
|
||||||
private var currency: String = "USD"
|
@SpecialString(trim = true, upperCase = true) private var currency: String = "USD"
|
||||||
) : StdMoney {
|
) : StdMoney {
|
||||||
|
|
||||||
//////////////////// - PROPERTIES - ////////////////////
|
//////////////////// - PROPERTIES - ////////////////////
|
||||||
@ -12,7 +12,7 @@ open class Money(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getMoneyCurrency(): String {
|
override fun getMoneyCurrency(): String {
|
||||||
return this.currency.toUpperCase()
|
return this.currency
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////// - GENERIC - ////////////////////
|
//////////////////// - 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
|
package com.cubetiqs.libra.moneyutils
|
||||||
|
|
||||||
operator fun Money.unaryMinus() = (-getMoneyValue())
|
operator fun StdMoney.unaryMinus() = (-getMoneyValue())
|
||||||
operator fun Money.unaryPlus() = (+getMoneyValue())
|
operator fun StdMoney.unaryPlus() = (+getMoneyValue())
|
||||||
operator fun Money.inc() = Money(value++)
|
operator fun Money.inc() = Money(value++)
|
||||||
operator fun Money.dec() = Money(value--)
|
operator fun Money.dec() = Money(value--)
|
||||||
operator fun Money.plus(other: Money) = Money(value + other.value)
|
operator fun StdMoney.plus(other: StdMoney) = Money(getMoneyValue() + other.getMoneyValue())
|
||||||
operator fun Money.times(other: Money) = Money(value * other.value)
|
operator fun StdMoney.times(other: StdMoney) = Money(getMoneyValue() * other.getMoneyValue())
|
||||||
operator fun Money.div(other: Money) = Money(value / other.value)
|
operator fun StdMoney.div(other: StdMoney) = Money(getMoneyValue() / other.getMoneyValue())
|
||||||
operator fun Money.timesAssign(other: Money) {
|
operator fun Money.timesAssign(other: StdMoney) {
|
||||||
this.value = this.value * other.value
|
this.value = this.getMoneyValue() * other.getMoneyValue()
|
||||||
}
|
}
|
||||||
operator fun Money.not() = this.value != this.value
|
|
@ -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
|
* @return String
|
||||||
*/
|
*/
|
||||||
|
@SpecialString
|
||||||
fun getMoneyCurrency(): String
|
fun getMoneyCurrency(): String
|
||||||
}
|
}
|
@ -2,20 +2,21 @@ import com.cubetiqs.libra.moneyutils.Money
|
|||||||
import com.cubetiqs.libra.moneyutils.MoneyConfig
|
import com.cubetiqs.libra.moneyutils.MoneyConfig
|
||||||
import com.cubetiqs.libra.moneyutils.MoneyCurrency
|
import com.cubetiqs.libra.moneyutils.MoneyCurrency
|
||||||
import com.cubetiqs.libra.moneyutils.MoneyExchangeUtils
|
import com.cubetiqs.libra.moneyutils.MoneyExchangeUtils
|
||||||
import com.cubetiqs.libra.moneyutils.plus
|
import com.cubetiqs.libra.moneyutils.SpecialStringProcessor
|
||||||
import com.cubetiqs.libra.moneyutils.times
|
|
||||||
import com.cubetiqs.libra.moneyutils.timesAssign
|
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
class MoneyTests {
|
class MoneyTests {
|
||||||
@Test
|
@Test
|
||||||
fun money_operator_test() {
|
fun money_operator_test() {
|
||||||
val money = Money(10.0)
|
// val money = Money(10.0)
|
||||||
val money2 = Money(20.0)
|
// val money2 = Money(20.0)
|
||||||
money *= money
|
// money *= money
|
||||||
println((money + money2) * money2)
|
// println((money + money2) * money2)
|
||||||
Assert.assertEquals(100.0, money.value, 0.0)
|
// Assert.assertEquals(100.0, money.value, 0.0)
|
||||||
|
|
||||||
|
val test = SpecialStringProcessor().serialize(Money(1.0, " usd "))
|
||||||
|
println(test)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -47,7 +48,7 @@ class MoneyTests {
|
|||||||
.setDeliEqual('=')
|
.setDeliEqual('=')
|
||||||
.setDeliSplit(';')
|
.setDeliSplit(';')
|
||||||
|
|
||||||
MoneyConfig.parse("USD=1,KHR=4000,EUR=0.99")
|
MoneyConfig.parse("USD:1,KHR=4000,EUR=0.99")
|
||||||
|
|
||||||
val moneyUsd = Money.ONE
|
val moneyUsd = Money.ONE
|
||||||
val moneyKhr = Money.create(20000.0, MoneyCurrency.KHR)
|
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