diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/Formatter.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/Formatter.kt index 4c1a0141..08912bdd 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/Formatter.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/Formatter.kt @@ -111,7 +111,7 @@ open class UnittoFormatter { } /** - * Remove formatting. Reverses [format] + * Reapply formatting. Reverses [format] and applies [format] again. */ fun reFormat(input: String): String { // We get 123.45,6789 @@ -121,11 +121,30 @@ open class UnittoFormatter { // Remove grouping // 12345,6789 // Replace fractional with "." because formatter accepts only numbers where fractional is a dot + return format(removeFormat(input)) + } - val cleanString = input + /** + * Helper method to change formatting from [input] with a specified [separator] to the one that + * is set for this [UnittoFormatter]. + */ + fun fromSeparator(input: String, separator: Int): String { + val sGrouping = when (separator) { + Separator.PERIOD -> PERIOD + Separator.COMMA -> COMMA + else -> SPACE + } + val sFractional = if (separator == Separator.PERIOD) KEY_COMMA else KEY_DOT + + return input + .replace(sGrouping, grouping) + .replace(sFractional, fractional) + } + + fun removeFormat(input: String): String { + return input .replace(grouping, "") .replace(fractional, KEY_DOT) - return format(cleanString) } /** diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/TextFieldController.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/TextFieldController.kt index d1cb5ed2..10a9e848 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/TextFieldController.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/TextFieldController.kt @@ -58,6 +58,7 @@ import com.sadellie.unitto.core.base.KEY_RIGHT_BRACKET import com.sadellie.unitto.core.base.KEY_SIN import com.sadellie.unitto.core.base.KEY_SQRT import com.sadellie.unitto.core.base.KEY_TAN +import com.sadellie.unitto.core.base.Separator import com.sadellie.unitto.core.ui.UnittoFormatter import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update @@ -73,8 +74,7 @@ class TextFieldController @Inject constructor() { // react to formatting preferences at this level. private val localFormatter: UnittoFormatter by lazy { UnittoFormatter().also { - it.grouping = "`" - it.fractional = "|" + it.setSeparator(Separator.COMMA) } } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/InputTextField.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/InputTextField.kt index f65af301..aaf4ebe6 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/InputTextField.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/InputTextField.kt @@ -33,6 +33,7 @@ import androidx.compose.ui.platform.LocalView import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.style.TextAlign +import com.sadellie.unitto.core.base.Separator import com.sadellie.unitto.core.ui.Formatter import com.sadellie.unitto.core.ui.theme.NumbersTextStyleDisplayLarge @@ -49,19 +50,15 @@ internal fun InputTextField( derivedStateOf { value.copy( // We replace this because internally input value is already formatted, but uses - // "|" as grouping and "-" as fractional. - value.text - .replace("`", Formatter.grouping) - .replace("|", Formatter.fractional) + // COMMA as separator. + Formatter.fromSeparator(value.text, Separator.COMMA) ) } } fun copyToClipboard() = clipboardManager.setText( AnnotatedString( - formattedInput.text - .replace(Formatter.grouping, "") - .replace(Formatter.fractional, ".") + Formatter.removeFormat(formattedInput.text) ) ) diff --git a/feature/calculator/src/test/java/com/sadellie/unitto/feature/calculator/TextFieldControllerTest.kt b/feature/calculator/src/test/java/com/sadellie/unitto/feature/calculator/TextFieldControllerTest.kt index 978946b1..e24a67c9 100644 --- a/feature/calculator/src/test/java/com/sadellie/unitto/feature/calculator/TextFieldControllerTest.kt +++ b/feature/calculator/src/test/java/com/sadellie/unitto/feature/calculator/TextFieldControllerTest.kt @@ -29,8 +29,6 @@ internal class TextFieldControllerTest { private val TextFieldController.text: String get() = this.input.value.text - .replace("`", ",") - .replace("|", ".") private val TextFieldController.selection: IntRange get() = this.input.value.selection.start..this.input.value.selection.end