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)
}