zcash-android-wallet-sdk/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/model/ZecStringExt.kt

92 lines
3.6 KiB
Kotlin

package cash.z.ecc.android.sdk.demoapp.model
import android.content.Context
import cash.z.ecc.android.sdk.demoapp.R
object ZecStringExt {
private const val DIGITS_BETWEEN_GROUP_SEPARATORS = 3
/**
* Builds filter with current local monetary separators for continuous input checking. The
* solution is built upon regex validation and other common string validation checks.
*
* Regex example: ^([0-9]*([0-9]+([,]$|[,][0-9]+))*([.]$|[.][0-9]+)?)?$
* Inputs may differ according to user locale.
*
* Valid amounts: "" . | .123 | 123, | 123. | 123,456 | 123.456 | 123,456.789 | 123,456,789 | 123,456,789.123 | etc.
* Invalid amounts: 123,, | 123,. | 123.. | ,123 | 123.456.789 | etc.
*
* @param context used for loading localized pattern from strings.xml
* @param separators which consist of localized monetary separators
* @param zecString to be validated
*
* @return true in case of validation success, false otherwise
*/
fun filterContinuous(context: Context, separators: MonetarySeparators, zecString: String): Boolean {
if (!context.getString(
R.string.co_electriccoin_zcash_zec_amount_regex_continuous_filter,
separators.grouping,
separators.decimal
).toRegex().matches(zecString) || !checkFor3Digits(separators, zecString)
) {
return false
}
return true
}
/**
* Checks for at least 3 digits between grouping separators.
*
* @param separators which consist of localized monetary separators
* @param zecString to be validated
*
* @return true in case of validation success, false otherwise
*/
fun checkFor3Digits(separators: MonetarySeparators, zecString: String): Boolean {
if (zecString.count { it == separators.grouping } >= 2) {
val groups = zecString.split(separators.grouping)
for (i in 1 until (groups.size - 1)) {
if (groups[i].length != DIGITS_BETWEEN_GROUP_SEPARATORS) {
return false
}
}
}
return true
}
/**
* Builds filter with current local monetary separators for validation of entered ZEC amount
* after confirm button is pressed. The solution is built upon regex validation and other common
* string validation checks.
*
* Regex example: ^([0-9]{1,3}(?:[,]?[0-9]{3})*)*(?:[0-9]*[.][0-9]*)?$
* Inputs may differ according to user locale.
*
* Valid amounts: 123 | .123 | 123. | 123, | 123.456 | 123,456 | 123,456.789 | 123,456,789 | 123,456,789.123 | etc.
* Invalid amounts: "" | , | . | 123,, | 123,. | 123.. | ,123 | 123.456.789 | etc.
*
* @param context used for loading localized pattern from strings.xml
* @param separators which consist of localized monetary separators
* @param zecString to be validated
*
* @return true in case of validation success, false otherwise
*/
fun filterConfirm(context: Context, separators: MonetarySeparators, zecString: String): Boolean {
if (zecString.isBlank() ||
zecString == separators.grouping.toString() ||
zecString == separators.decimal.toString()
) {
return false
}
return (
context.getString(
R.string.co_electriccoin_zcash_zec_amount_regex_confirm_filter,
separators.grouping,
separators.decimal
).toRegex().matches(zecString) && checkFor3Digits(separators, zecString)
)
}
}