diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/activities/MainActivity.kt
index 033d3b0a..c55a404a 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calculator/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calculator/activities/MainActivity.kt
@@ -13,6 +13,7 @@ import com.simplemobiletools.calculator.databases.CalculatorDatabase
import com.simplemobiletools.calculator.dialogs.HistoryDialog
import com.simplemobiletools.calculator.extensions.config
import com.simplemobiletools.calculator.extensions.updateViewColors
+import com.simplemobiletools.calculator.extensions.updateWidgets
import com.simplemobiletools.calculator.helpers.*
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.LICENSE_AUTOFITTEXTVIEW
@@ -24,8 +25,11 @@ import me.grantland.widget.AutofitHelper
class MainActivity : SimpleActivity(), Calculator {
private var storedTextColor = 0
private var vibrateOnButtonPress = true
+ private var storedUseCommaAsDecimalMark = false
+ private var decimalSeparator = DOT
+ private var groupingSeparator = COMMA
- lateinit var calc: CalculatorImpl
+ private lateinit var calc: CalculatorImpl
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -34,26 +38,28 @@ class MainActivity : SimpleActivity(), Calculator {
calc = CalculatorImpl(this, applicationContext)
- btn_plus.setOnClickListener { calc.handleOperation(PLUS); checkHaptic(it) }
- btn_minus.setOnClickListener { calc.handleOperation(MINUS); checkHaptic(it) }
- btn_multiply.setOnClickListener { calc.handleOperation(MULTIPLY); checkHaptic(it) }
- btn_divide.setOnClickListener { calc.handleOperation(DIVIDE); checkHaptic(it) }
- btn_percent.setOnClickListener { calc.handleOperation(PERCENT); checkHaptic(it) }
- btn_power.setOnClickListener { calc.handleOperation(POWER); checkHaptic(it) }
- btn_root.setOnClickListener { calc.handleOperation(ROOT); checkHaptic(it) }
+ btn_plus.setOnClickOperation(PLUS)
+ btn_minus.setOnClickOperation(MINUS)
+ btn_multiply.setOnClickOperation(MULTIPLY)
+ btn_divide.setOnClickOperation(DIVIDE)
+ btn_percent.setOnClickOperation(PERCENT)
+ btn_power.setOnClickOperation(POWER)
+ btn_root.setOnClickOperation(ROOT)
+ btn_minus.setOnLongClickListener { calc.turnToNegative() }
- btn_minus.setOnLongClickListener {
- calc.turnToNegative()
+ btn_clear.setVibratingOnClickListener { calc.handleClear() }
+ btn_clear.setOnLongClickListener {
+ calc.handleReset()
+ true
}
- btn_clear.setOnClickListener { calc.handleClear(); checkHaptic(it) }
- btn_clear.setOnLongClickListener { calc.handleReset(); true }
-
getButtonIds().forEach {
- it.setOnClickListener { calc.numpadClicked(it.id); checkHaptic(it) }
+ it.setVibratingOnClickListener { view ->
+ calc.numpadClicked(view.id)
+ }
}
- btn_equals.setOnClickListener { calc.handleEquals(); checkHaptic(it) }
+ btn_equals.setVibratingOnClickListener { calc.handleEquals() }
formula.setOnLongClickListener { copyToClipboard(false) }
result.setOnLongClickListener { copyToClipboard(true) }
@@ -61,6 +67,7 @@ class MainActivity : SimpleActivity(), Calculator {
AutofitHelper.create(formula)
storeStateVariables()
updateViewColors(calculator_holder, getProperTextColor())
+ setupDecimalSeparator()
checkWhatsNewDialog()
checkAppOnSDCard()
}
@@ -75,6 +82,11 @@ class MainActivity : SimpleActivity(), Calculator {
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
+ if (storedUseCommaAsDecimalMark != config.useCommaAsDecimalMark) {
+ setupDecimalSeparator()
+ updateWidgets()
+ }
+
vibrateOnButtonPress = config.vibrateOnButtonPress
val properPrimaryColor = getProperPrimaryColor()
@@ -117,6 +129,7 @@ class MainActivity : SimpleActivity(), Calculator {
private fun storeStateVariables() {
config.apply {
storedTextColor = textColor
+ storedUseCommaAsDecimalMark = useCommaAsDecimalMark
}
}
@@ -186,4 +199,30 @@ class MainActivity : SimpleActivity(), Calculator {
override fun showNewFormula(value: String, context: Context) {
formula.text = value
}
+
+ private fun setupDecimalSeparator() {
+ storedUseCommaAsDecimalMark = config.useCommaAsDecimalMark
+ if (storedUseCommaAsDecimalMark) {
+ decimalSeparator = COMMA
+ groupingSeparator = DOT
+ } else {
+ decimalSeparator = DOT
+ groupingSeparator = COMMA
+ }
+ calc.updateSeparators(decimalSeparator, groupingSeparator)
+ btn_decimal.text = decimalSeparator
+ }
+
+ private fun View.setVibratingOnClickListener(callback: (view: View) -> Unit) {
+ setOnClickListener {
+ callback(it)
+ checkHaptic(it)
+ }
+ }
+
+ private fun View.setOnClickOperation(operation: String) {
+ setVibratingOnClickListener {
+ calc.handleOperation(operation)
+ }
+ }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/activities/SettingsActivity.kt
index 6d912c02..e12e9568 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calculator/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calculator/activities/SettingsActivity.kt
@@ -4,13 +4,17 @@ import android.content.Intent
import android.os.Bundle
import android.view.Menu
import com.simplemobiletools.calculator.R
+import com.simplemobiletools.calculator.extensions.calculatorDB
import com.simplemobiletools.calculator.extensions.config
+import com.simplemobiletools.calculator.extensions.updateWidgets
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.IS_CUSTOMIZING_COLORS
+import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import kotlinx.android.synthetic.main.activity_settings.*
import java.util.*
import kotlin.system.exitProcess
+
class SettingsActivity : SimpleActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
@@ -26,6 +30,7 @@ class SettingsActivity : SimpleActivity() {
setupUseEnglish()
setupVibrate()
setupPreventPhoneFromSleeping()
+ setupUseCommaAsDecimalMark()
setupCustomizeWidgetColors()
updateTextColors(settings_scrollview)
@@ -94,6 +99,18 @@ class SettingsActivity : SimpleActivity() {
}
}
+ private fun setupUseCommaAsDecimalMark() {
+ settings_use_comma_as_decimal_mark.isChecked = config.useCommaAsDecimalMark
+ settings_use_comma_as_decimal_mark_holder.setOnClickListener {
+ settings_use_comma_as_decimal_mark.toggle()
+ config.useCommaAsDecimalMark = settings_use_comma_as_decimal_mark.isChecked
+ updateWidgets()
+ ensureBackgroundThread {
+ applicationContext.calculatorDB.deleteHistory()
+ }
+ }
+ }
+
private fun setupCustomizeWidgetColors() {
settings_customize_widget_colors_holder.setOnClickListener {
Intent(this, WidgetConfigureActivity::class.java).apply {
diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/extensions/Context.kt
index a3b2b266..04a6efdd 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calculator/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calculator/extensions/Context.kt
@@ -1,12 +1,16 @@
package com.simplemobiletools.calculator.extensions
+import android.appwidget.AppWidgetManager
+import android.content.ComponentName
import android.content.Context
+import android.content.Intent
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
-import com.simplemobiletools.calculator.helpers.Config
-import com.simplemobiletools.calculator.interfaces.CalculatorDao
import com.simplemobiletools.calculator.databases.CalculatorDatabase
+import com.simplemobiletools.calculator.helpers.Config
+import com.simplemobiletools.calculator.helpers.MyWidgetProvider
+import com.simplemobiletools.calculator.interfaces.CalculatorDao
val Context.config: Config get() = Config.newInstance(applicationContext)
@@ -16,11 +20,23 @@ val Context.calculatorDB: CalculatorDao get() = CalculatorDatabase.getInstance(a
fun Context.updateViewColors(viewGroup: ViewGroup, textColor: Int) {
val cnt = viewGroup.childCount
(0 until cnt).map { viewGroup.getChildAt(it) }
- .forEach {
- when (it) {
- is TextView -> it.setTextColor(textColor)
- is Button -> it.setTextColor(textColor)
- is ViewGroup -> updateViewColors(it, textColor)
- }
+ .forEach {
+ when (it) {
+ is TextView -> it.setTextColor(textColor)
+ is Button -> it.setTextColor(textColor)
+ is ViewGroup -> updateViewColors(it, textColor)
}
+ }
+}
+
+fun Context.updateWidgets() {
+ val widgetIDs = AppWidgetManager.getInstance(applicationContext)?.getAppWidgetIds(ComponentName(applicationContext, MyWidgetProvider::class.java))
+ ?: return
+ if (widgetIDs.isNotEmpty()) {
+ Intent(applicationContext, MyWidgetProvider::class.java).apply {
+ action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
+ putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIDs)
+ sendBroadcast(this)
+ }
+ }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/CalculatorImpl.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/CalculatorImpl.kt
index 9ae38448..d04cdbd3 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/CalculatorImpl.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/CalculatorImpl.kt
@@ -8,7 +8,12 @@ import com.simplemobiletools.commons.extensions.toast
import net.objecthunter.exp4j.ExpressionBuilder
import java.math.BigDecimal
-class CalculatorImpl(calculator: Calculator, private val context: Context) {
+class CalculatorImpl(
+ calculator: Calculator,
+ private val context: Context,
+ private var decimalSeparator: String = DOT,
+ private var groupingSeparator: String = COMMA
+) {
private var callback: Calculator? = calculator
private var baseValue = 0.0
@@ -20,6 +25,10 @@ class CalculatorImpl(calculator: Calculator, private val context: Context) {
private val operationsRegex = "[-+×÷^%√]".toPattern()
private val numbersRegex = "[^0-9,.]".toRegex()
+ private val formatter = NumberFormatHelper(
+ decimalSeparator = decimalSeparator, groupingSeparator = groupingSeparator
+ )
+
init {
showNewResult("0")
}
@@ -35,21 +44,21 @@ class CalculatorImpl(calculator: Calculator, private val context: Context) {
}
private fun zeroClicked() {
- val valueToCheck = inputDisplayedFormula.trimStart('-').replace(",", "")
+ val valueToCheck = inputDisplayedFormula.trimStart('-').removeGroupSeparator()
val value = valueToCheck.substring(valueToCheck.indexOfAny(operations) + 1)
- if (value != "0" || value.contains(".")) {
+ if (value != "0" || value.contains(decimalSeparator)) {
addDigit(0)
}
}
private fun decimalClicked() {
- val valueToCheck = inputDisplayedFormula.trimStart('-').replace(",", "")
+ val valueToCheck = inputDisplayedFormula.trimStart('-').replace(groupingSeparator, "")
val value = valueToCheck.substring(valueToCheck.indexOfAny(operations) + 1)
- if (!value.contains(".")) {
+ if (!value.contains(decimalSeparator)) {
when {
- value == "0" && !valueToCheck.contains(operationsRegex.toRegex()) -> inputDisplayedFormula = "0."
- value == "" -> inputDisplayedFormula += "0."
- else -> inputDisplayedFormula += "."
+ value == "0" && !valueToCheck.contains(operationsRegex.toRegex()) -> inputDisplayedFormula = "0$decimalSeparator"
+ value == "" -> inputDisplayedFormula += "0$decimalSeparator"
+ else -> inputDisplayedFormula += decimalSeparator
}
}
@@ -60,10 +69,13 @@ class CalculatorImpl(calculator: Calculator, private val context: Context) {
private fun addThousandsDelimiter() {
val valuesToCheck = numbersRegex.split(inputDisplayedFormula).filter { it.trim().isNotEmpty() }
valuesToCheck.forEach {
- var newString = Formatter.addGroupingSeparators(it)
+ var newString = formatter.addGroupingSeparators(it)
+
// allow writing numbers like 0.003
- if (it.contains(".")) {
- newString = newString.substringBefore(".") + ".${it.substringAfter(".")}"
+ if (it.contains(decimalSeparator)) {
+ val firstPart = newString.substringBefore(decimalSeparator)
+ val lastPart = it.substringAfter(decimalSeparator)
+ newString = "$firstPart$decimalSeparator$lastPart"
}
inputDisplayedFormula = inputDisplayedFormula.replace(it, newString)
@@ -86,7 +98,7 @@ class CalculatorImpl(calculator: Calculator, private val context: Context) {
}
val lastChar = inputDisplayedFormula.last().toString()
- if (lastChar == ".") {
+ if (lastChar == decimalSeparator) {
inputDisplayedFormula = inputDisplayedFormula.dropLast(1)
} else if (operations.contains(lastChar)) {
inputDisplayedFormula = inputDisplayedFormula.dropLast(1)
@@ -137,7 +149,7 @@ class CalculatorImpl(calculator: Calculator, private val context: Context) {
return false
}
- if (!inputDisplayedFormula.trimStart('-').any { it.toString() in operations } && inputDisplayedFormula.replace(",", "").toDouble() != 0.0) {
+ if (!inputDisplayedFormula.trimStart('-').any { it.toString() in operations } && inputDisplayedFormula.removeGroupSeparator().toDouble() != 0.0) {
inputDisplayedFormula = if (inputDisplayedFormula.first() == '-') {
inputDisplayedFormula.substring(1)
} else {
@@ -185,7 +197,7 @@ class CalculatorImpl(calculator: Calculator, private val context: Context) {
}
private fun getSecondValue(): Double {
- val valueToCheck = inputDisplayedFormula.trimStart('-').replace(",", "")
+ val valueToCheck = inputDisplayedFormula.trimStart('-').removeGroupSeparator()
var value = valueToCheck.substring(valueToCheck.indexOfAny(operations) + 1)
if (value == "") {
value = "0"
@@ -205,23 +217,28 @@ class CalculatorImpl(calculator: Calculator, private val context: Context) {
}
if (lastKey != EQUALS) {
- val valueToCheck = inputDisplayedFormula.trimStart('-').replace(",", "")
+ val valueToCheck = inputDisplayedFormula.trimStart('-').removeGroupSeparator()
val parts = valueToCheck.split(operationsRegex).filter { it != "" }
if (parts.isEmpty()) {
return
}
- baseValue = Formatter.stringToDouble(parts.first())
+ baseValue = parts.first().toDouble()
if (inputDisplayedFormula.startsWith("-")) {
baseValue *= -1
}
- secondValue = parts.getOrNull(1)?.replace(",", "")?.toDouble() ?: secondValue
+ secondValue = parts.getOrNull(1)?.toDouble() ?: secondValue
}
if (lastOperation != "") {
val sign = getSign(lastOperation)
- val expression = "${baseValue.format()}$sign${secondValue.format()}".replace("√", "sqrt").replace("×", "*").replace("÷", "/")
+ val formattedBaseValue = baseValue.format().removeGroupSeparator()
+ val formatterSecondValue = secondValue.format().removeGroupSeparator()
+ val expression = "$formattedBaseValue$sign$formatterSecondValue"
+ .replace("√", "sqrt")
+ .replace("×", "*")
+ .replace("÷", "/")
try {
if (sign == "÷" && secondValue == 0.0) {
@@ -229,16 +246,11 @@ class CalculatorImpl(calculator: Calculator, private val context: Context) {
return
}
- if (sign == "%") {
- val second = secondValue / 100f
- "${baseValue.format()}*${second.format()}".replace("√", "sqrt").replace("×", "*").replace("÷", "/")
- }
-
// handle percents manually, it doesn't seem to be possible via net.objecthunter:exp4j. "%" is used only for modulo there
// handle cases like 10%200 here
val result = if (sign == "%") {
- val second = secondValue / 100f
- ExpressionBuilder("${baseValue.format().replace(",", "")}*${second.format()}").build().evaluate()
+ val second = (secondValue / 100f).format().removeGroupSeparator()
+ ExpressionBuilder("$formattedBaseValue*$second").build().evaluate()
} else {
// avoid Double rounding errors at expressions like 5250,74 + 14,98
if (sign == "+" || sign == "-") {
@@ -250,7 +262,7 @@ class CalculatorImpl(calculator: Calculator, private val context: Context) {
}
bigDecimalResult.toDouble()
} else {
- ExpressionBuilder(expression.replace(",", "")).build().evaluate()
+ ExpressionBuilder(expression).build().evaluate()
}
}
@@ -260,11 +272,14 @@ class CalculatorImpl(calculator: Calculator, private val context: Context) {
}
showNewResult(result.format())
- baseValue = result
- val newFormula = expression.replace("sqrt", "√").replace("*", "×").replace("/", "÷")
- HistoryHelper(context).insertOrUpdateHistoryEntry(History(null, newFormula, result.format(), System.currentTimeMillis()))
- inputDisplayedFormula = result.format()
+ val newFormula = "${baseValue.format()}$sign${secondValue.format()}"
+ HistoryHelper(context).insertOrUpdateHistoryEntry(
+ History(id = null, formula = newFormula, result = result.format(), timestamp = System.currentTimeMillis())
+ )
showNewFormula(newFormula)
+
+ inputDisplayedFormula = result.format()
+ baseValue = result
} catch (e: Exception) {
context.toast(R.string.unknown_error_occurred)
}
@@ -317,19 +332,13 @@ class CalculatorImpl(calculator: Calculator, private val context: Context) {
}
val lastValue = newValue.last().toString()
lastKey = when {
- operations.contains(lastValue) -> {
- CLEAR
- }
- lastValue == "." -> {
- DECIMAL
- }
- else -> {
- DIGIT
- }
+ operations.contains(lastValue) -> CLEAR
+ lastValue == decimalSeparator -> DECIMAL
+ else -> DIGIT
}
}
- newValue = newValue.trimEnd(',')
+ newValue = newValue.trimEnd(groupingSeparator.single())
inputDisplayedFormula = newValue
addThousandsDelimiter()
showNewResult(inputDisplayedFormula)
@@ -391,4 +400,19 @@ class CalculatorImpl(calculator: Calculator, private val context: Context) {
addThousandsDelimiter()
showNewResult(inputDisplayedFormula)
}
+
+ fun updateSeparators(decimalSeparator: String, groupingSeparator: String) {
+ if (this.decimalSeparator != decimalSeparator || this.groupingSeparator != groupingSeparator) {
+ this.decimalSeparator = decimalSeparator
+ this.groupingSeparator = groupingSeparator
+ formatter.decimalSeparator = decimalSeparator
+ formatter.groupingSeparator = groupingSeparator
+ // future: maybe update the formulas with new separators instead of resetting the whole thing
+ handleReset()
+ }
+ }
+
+ private fun Double.format() = formatter.doubleToString(this)
+
+ private fun String.removeGroupSeparator() = formatter.removeGroupingSeparator(this)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Config.kt
index f9c286a0..004a3863 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Config.kt
@@ -7,4 +7,8 @@ class Config(context: Context) : BaseConfig(context) {
companion object {
fun newInstance(context: Context) = Config(context)
}
+
+ var useCommaAsDecimalMark: Boolean
+ get() = prefs.getBoolean(USE_COMMA_AS_DECIMAL_MARK, false)
+ set(useCommaAsDecimalMark) = prefs.edit().putBoolean(USE_COMMA_AS_DECIMAL_MARK, useCommaAsDecimalMark).apply()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Constants.kt
index 8e8af427..a00ac851 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Constants.kt
@@ -24,3 +24,9 @@ const val SIX = "six"
const val SEVEN = "seven"
const val EIGHT = "eight"
const val NINE = "nine"
+
+const val DOT = "."
+const val COMMA = ","
+
+// shared prefs
+const val USE_COMMA_AS_DECIMAL_MARK = "use_comma_as_decimal_mark"
diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Formatter.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Formatter.kt
deleted file mode 100644
index 6827f083..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Formatter.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.simplemobiletools.calculator.helpers
-
-import java.text.DecimalFormat
-import java.text.DecimalFormatSymbols
-import java.util.*
-
-object Formatter {
- fun doubleToString(d: Double): String {
- val symbols = DecimalFormatSymbols(Locale.US)
- symbols.decimalSeparator = '.'
- symbols.groupingSeparator = ','
-
- val formatter = DecimalFormat()
- formatter.maximumFractionDigits = 12
- formatter.decimalFormatSymbols = symbols
- formatter.isGroupingUsed = true
- return formatter.format(d)
- }
-
- fun stringToDouble(str: String) = str.replace(",", "").toDouble()
-
- fun addGroupingSeparators(str: String) = doubleToString(stringToDouble(str))
-}
-
-fun Double.format(): String = Formatter.doubleToString(this)
diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/MyWidgetProvider.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/MyWidgetProvider.kt
index ca1cadbf..45cdd3e1 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/MyWidgetProvider.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/MyWidgetProvider.kt
@@ -17,6 +17,9 @@ import com.simplemobiletools.commons.extensions.setText
class MyWidgetProvider : AppWidgetProvider(), Calculator {
companion object {
private var calc: CalculatorImpl? = null
+ private var storedUseCommaAsDecimalMark = false
+ private var decimalSeparator = DOT
+ private var groupingSeparator = COMMA
}
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
@@ -53,6 +56,7 @@ class MyWidgetProvider : AppWidgetProvider(), Calculator {
views.applyColorFilter(R.id.widget_background, config.widgetBgColor)
updateTextColors(views, config.widgetTextColor)
+ setupDecimalSeparator(views, config.useCommaAsDecimalMark)
appWidgetManager.updateAppWidget(it, views)
}
}
@@ -97,7 +101,7 @@ class MyWidgetProvider : AppWidgetProvider(), Calculator {
private fun myAction(action: String, context: Context) {
if (calc == null) {
- calc = CalculatorImpl(this, context)
+ calc = CalculatorImpl(this, context, decimalSeparator, groupingSeparator)
}
when (action) {
@@ -141,4 +145,17 @@ class MyWidgetProvider : AppWidgetProvider(), Calculator {
super.onDeleted(context, appWidgetIds)
calc = null
}
+
+ private fun setupDecimalSeparator(views: RemoteViews, useCommaAsDecimalMark: Boolean) {
+ storedUseCommaAsDecimalMark = useCommaAsDecimalMark
+ if (storedUseCommaAsDecimalMark) {
+ decimalSeparator = COMMA
+ groupingSeparator = DOT
+ } else {
+ decimalSeparator = DOT
+ groupingSeparator = COMMA
+ }
+ calc?.updateSeparators(decimalSeparator, groupingSeparator)
+ views.setTextViewText(R.id.btn_decimal, decimalSeparator)
+ }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/NumberFormatHelper.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/NumberFormatHelper.kt
new file mode 100644
index 00000000..eb8d3e9f
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/NumberFormatHelper.kt
@@ -0,0 +1,31 @@
+package com.simplemobiletools.calculator.helpers
+
+import java.text.DecimalFormat
+import java.text.DecimalFormatSymbols
+import java.util.*
+
+class NumberFormatHelper(
+ var decimalSeparator: String = DOT,
+ var groupingSeparator: String = COMMA
+) {
+
+ fun doubleToString(d: Double): String {
+ val symbols = DecimalFormatSymbols(Locale.US)
+ symbols.decimalSeparator = decimalSeparator.single()
+ symbols.groupingSeparator = groupingSeparator.single()
+
+ val formatter = DecimalFormat()
+ formatter.maximumFractionDigits = 12
+ formatter.decimalFormatSymbols = symbols
+ formatter.isGroupingUsed = true
+ return formatter.format(d)
+ }
+
+ fun addGroupingSeparators(str: String): String {
+ return doubleToString(removeGroupingSeparator(str).toDouble())
+ }
+
+ fun removeGroupingSeparator(str: String): String {
+ return str.replace(groupingSeparator, "").replace(decimalSeparator, DOT)
+ }
+}
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index 87e7e4f7..cfd6fb4b 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -126,7 +126,7 @@
style="@style/SettingsHolderCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/ripple_bottom_corners">
+ android:background="@drawable/ripple_background">
+
+
+
+
+
+