92 lines
3.6 KiB
Kotlin
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)
|
|
)
|
|
}
|
|
}
|