← Back to garden 🤏

output

Android Displayable Utilities


Description

UI Text

This helper class allows us to use DynamicStrings and Strings from the viewModel and other layers without using the Context

sealed class UiText {
    data class DynamicString(val value: String): UiText()
    class StringResource (
        @StringRes val resId: Int,
        vararg val args: Any
    ) : UiText()

    @Composable
    fun asString(): String {
        return when(this) {
            is StringResource -> stringResource(resId, *args)
            is DynamicString -> value
        }
    }

    fun asString(context: Context): String {
        return when(this) {
            is DynamicString -> value
            is StringResource -> context.getString(resId, *args)
        }
    }
}

DisplayableNumber

This helper allows you to have a number as a formatted instance while also having access to its actual value to perform mathematical operations.

data class UiNumber(
    val value: Double,
    val formatted: String
)

fun Double.toUiNumber(
    minimumFractionDigits: Int = 0,
    maximumFractionDigits: Int = 0,
): UiNumber {
    val formatter = NumberFormat.getNumberInstance(Locale.getDefault()).apply {
        this.minimumFractionDigits = minimumFractionDigits
        this.maximumFractionDigits = maximumFractionDigits
    }
    return UiNumber(
        value = this,
        formatted = formatter.format(this)
    )
}


fun Int.toUiNumber(
    minimumFractionDigits: Int = 0,
    maximumFractionDigits: Int = 0,
) = this.toDouble().toUiNumber(minimumFractionDigits, maximumFractionDigits)

fun Float.toUiNumber(
    minimumFractionDigits: Int = 0,
    maximumFractionDigits: Int = 0,
) = this.toDouble().toUiNumber(minimumFractionDigits, maximumFractionDigits)

Displayable Date

This allows you to have a reference to a LocalDate from kotlinx-datetime and also have a formatted value.

data class DisplayableDate(
    val value: LocalDate,
    val formatted: String
)

fun LocalDate.toDisplayableDate(
    format: LocalDate.Format
): DisplayableDate {
    return DisplayableDate(
        value = this,
        formatted = format(this)
    )
}

fun LocalDate.toDisplayableDate(
    pattern: String
): DisplayableDate {
    val format = LocalDate.Format { byUnicodePattern(pattern) }
    return DisplayableDate(
        value = this,
        formatted = format(this)
    )
}

// Usage

fun main() {
	val option1 = LocalDate(2024,3,11)
	val customFormat = LocalDate.Format {
        monthName(MonthNames.ENGLISH_ABBREVIATED); char(' '); dayOfMonth(); chars(", "); year()
    }

    val displayableDate = option1.toDisplayableDate(customFormat)
    println(displayableDate.formatted) // Output: "Mar 1, 2024"

	val option1 = LocalDate(2024,3,11)
	val formatDate1 = option1.toDisplayableDate("yyyy-MM-dd") // "2024-03-01"
	
	println(displayableDate.formatted)


}