Skip to content

Commit 3f201a9

Browse files
committed
完成标准计算器所有运算
1 parent 08c7524 commit 3f201a9

File tree

7 files changed

+275
-67
lines changed

7 files changed

+275
-67
lines changed

app/build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ dependencies {
5757
implementation "androidx.compose.material:material:$compose_version"
5858
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
5959
implementation "androidx.compose.material:material-icons-extended:$compose_version"
60-
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
60+
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
61+
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
62+
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version"
63+
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
6164
implementation 'androidx.activity:activity-compose:1.4.0'
6265

6366
testImplementation 'junit:junit:4.13.2'

app/src/main/java/com/equationl/calculator_compose/MainActivity.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import androidx.compose.foundation.layout.fillMaxSize
77
import androidx.compose.material.MaterialTheme
88
import androidx.compose.material.Surface
99
import androidx.compose.ui.Modifier
10+
import androidx.lifecycle.viewmodel.compose.viewModel
1011
import com.equationl.calculator_compose.ui.theme.CalculatorComposeTheme
12+
import com.equationl.calculator_compose.view.StandardScreen
13+
import com.equationl.calculator_compose.viewModel.StandardViewModel
1114

1215
class MainActivity : ComponentActivity() {
1316
override fun onCreate(savedInstanceState: Bundle?) {
@@ -19,7 +22,8 @@ class MainActivity : ComponentActivity() {
1922
modifier = Modifier.fillMaxSize(),
2023
color = MaterialTheme.colors.background
2124
) {
22-
25+
val viewModel: StandardViewModel = viewModel()
26+
StandardScreen(viewModel)
2327
}
2428
}
2529
}

app/src/main/java/com/equationl/calculator_compose/dataModel/KeyBoardData.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ val EqualColor = Color.Cyan
1010

1111
val StandardKeyBoardBtn = listOf(
1212
listOf(
13-
KeyBoardData("%", FunctionColor, KeyBoardBtnSize.Standard, 0),
13+
KeyBoardData("%", FunctionColor, KeyBoardBtnSize.Standard, 19),
1414
KeyBoardData("CE", FunctionColor, KeyBoardBtnSize.Standard, 1001),
1515
KeyBoardData("C", FunctionColor, KeyBoardBtnSize.Standard, 1002),
1616
KeyBoardData("", FunctionColor, KeyBoardBtnSize.Standard, 1003),
1717
),
1818
listOf(
19-
KeyBoardData("1/x", FunctionColor, KeyBoardBtnSize.Standard, 4),
20-
KeyBoardData("", FunctionColor, KeyBoardBtnSize.Standard, 5),
21-
KeyBoardData("√x", FunctionColor, KeyBoardBtnSize.Standard, 6),
19+
KeyBoardData("1/x", FunctionColor, KeyBoardBtnSize.Standard, 16),
20+
KeyBoardData("", FunctionColor, KeyBoardBtnSize.Standard, 17),
21+
KeyBoardData("√x", FunctionColor, KeyBoardBtnSize.Standard, 18),
2222
KeyBoardData(Operator.Divide.showText, FunctionColor, KeyBoardBtnSize.Standard, 13),
2323
),
2424
listOf(
@@ -64,5 +64,7 @@ enum class Operator(val showText: String) {
6464
MINUS("-"),
6565
MULTIPLY("×"),
6666
Divide("÷"),
67+
SQRT(""),
68+
POW2("²"),
6769
NUll("")
6870
}

app/src/main/java/com/equationl/calculator_compose/utils/Utils.kt

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.equationl.calculator_compose.utils
33
import androidx.core.text.isDigitsOnly
44
import com.equationl.calculator_compose.dataModel.Operator
55
import java.math.BigDecimal
6+
import java.math.RoundingMode
67

78
/**
89
* BigDecimal 的开平方
@@ -25,9 +26,9 @@ fun BigDecimal.sqrt(scale: Int): BigDecimal {
2526
/**
2627
* 格式化数字(添加逗号分隔符)
2728
* */
28-
fun String.formatNumber(): String {
29+
fun String.formatNumber(formatDecimal: Boolean = false, formatInteger: Boolean = true): String {
2930
// 如果不是合法数字则不做处理
30-
if (this.substring(0, 1) != "-" && !this.isDigitsOnly()) return this
31+
if (this.substring(0, 1) != "-" && !this.replace(".", "").isDigitsOnly()) return this
3132

3233
val stringBuilder = StringBuilder(this)
3334

@@ -48,11 +49,25 @@ fun String.formatNumber(): String {
4849
decimal.insert(0, '.')
4950
}
5051

51-
// 添加逗号分隔符
52-
if (integer.length > 3) {
53-
val end = if (integer[0] == '-') 2 else 1 // 判断是否有前导符号
54-
for (i in integer.length-3 downTo end step 3) {
55-
integer.insert(i, ",")
52+
if (formatInteger) {
53+
// 给整数部分添加逗号分隔符
54+
if (integer.length > 3) {
55+
val end = if (integer[0] == '-') 2 else 1 // 判断是否有前导符号
56+
for (i in integer.length-3 downTo end step 3) {
57+
integer.insert(i, ",")
58+
}
59+
}
60+
}
61+
62+
if (formatDecimal) {
63+
// 移除小数部分末尾占位的 0
64+
if (decimal.isNotEmpty()) {
65+
while (decimal.last() == '0') {
66+
decimal.deleteAt(decimal.lastIndex)
67+
}
68+
if (decimal.length == 1) { // 上面我们给小数部分首位添加了点号 ”.“ ,所以如果长度为 1 则表示不存在有效小数,则将点号也删除掉
69+
decimal.deleteAt(0)
70+
}
5671
}
5772
}
5873

@@ -78,8 +93,16 @@ fun calculate(leftValue: String, rightValue: String, operator: Operator): Result
7893
if (right.signum() == 0) {
7994
return Result.failure(ArithmeticException("除数不能为零"))
8095
}
81-
left.setScale(16)
82-
return Result.success(left.divide(right))
96+
return Result.success(left.divide(right, 16, RoundingMode.HALF_UP))
97+
}
98+
Operator.SQRT -> {
99+
if (left.signum() == -1) {
100+
return Result.failure(ArithmeticException("无效输入"))
101+
}
102+
return Result.success(left.sqrt(16))
103+
}
104+
Operator.POW2 -> {
105+
return Result.success(left.pow(2))
83106
}
84107
Operator.NUll -> {
85108
return Result.success(left)

app/src/main/java/com/equationl/calculator_compose/view/StandardScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ fun StandardScreen(viewModel: StandardViewModel) {
3838
Modifier
3939
.fillMaxWidth()
4040
.height(150.dp), horizontalAlignment = Alignment.End, verticalArrangement = Arrangement.Center) {
41-
Text(text = "${viewState.showValueLeft}${viewState.inputOperator.showText}${viewState.showValueRight}", modifier = Modifier.padding(8.dp), fontSize = 24.sp)
42-
Text(text = viewState.inputValue.formatNumber(), modifier = Modifier.padding(8.dp), fontSize = 32.sp, fontWeight = FontWeight.Bold)
41+
Text(text = viewState.showText, modifier = Modifier.padding(8.dp), fontSize = 24.sp)
42+
Text(text = viewState.inputValue.formatNumber(viewState.isFinalResult), modifier = Modifier.padding(8.dp), fontSize = 32.sp, fontWeight = FontWeight.Bold)
4343
}
4444

4545
StandardKeyBoard(viewModel)

0 commit comments

Comments
 (0)