HarmonyOS使用Grid网格实现计算器功能实现

news/2025/1/19 13:21:41/

使用Grid网格处理,实现了计算器的加减乘除功能

@Entry
@Component
struct GridPage {@State str: string = ""; //暂存区@State num: string = "0"; //输入区@State flagNum: boolean = false; //标识build() {Column() {Grid() {GridItem() {Text(this.str) //默认为空}.columnStart(1) //colum表示列.columnEnd(4) //1-4列.backgroundColor(Color.Pink)GridItem() {Text(this.num.toString())// 默认为0.fontSize(40).fontWeight(FontWeight.Normal)}.columnStart(1) //colum表示列.columnEnd(4) //1-4列.backgroundColor(Color.White)GridItem() {Button('CE', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {const lastChar = this.str[this.str.length - 1]; // 获取最后一个字符if (lastChar === '=') { //清空操作this.str = "";}this.num = "0"console.info(`text组件内容是:${this.num}`)})}.backgroundColor(Color.Red)GridItem() {Button('C', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {this.num = '0' //重置this.str = '' //重置console.info(`text组件内容是:${this.num}`)})}.backgroundColor(Color.Red)GridItem() {Button('/', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {const flag = this.str[this.str.length - 1] === '='if (flag) {this.str = this.num + "/"; //如果结果已经计算,就重置为/} else {if (!this.flagNum) { //防止多打印出/线标识const flag = this.str[this.str.length - 1] === '/' //判断最后一个字符是不是/if (!flag) {this.str = this.num + "/"; //如果不是则添加一个} else { //如果是则进行计算const result = parseAndChu(this.str, this.num);this.num = result.toString();this.str = result.toString() + "/";}} else {//如果不是则默认为初始第一个const st = removeLastIfOperator(this.str) + "/";this.str = st;}}this.flagNum = true;console.info(`str组件内容是:${this.str}`)})}.backgroundColor(Color.Red)GridItem() {Button('*', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {const flag = this.str[this.str.length - 1] === '='if (flag) {this.str = this.num + "*";} else {if (!this.flagNum) {const flag = this.str[this.str.length - 1] === '*'if (!flag) {this.str = this.num + "*";} else {const result = parseAndCheng(this.str, this.num);this.num = result.toString();this.str = result.toString() + "*";}} else {const st = removeLastIfOperator(this.str) + "*";this.str = st;}}this.flagNum = true;console.info(`str组件内容是:${this.str}`)})}.backgroundColor(Color.Red)GridItem() {Button('7', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {if (this.flagNum) {this.num = "7"} else {this.num = this.num == '0' ? "7" : this.num + "7"}this.flagNum = false;console.info(`text组件内容是:${this.num}`)console.info(`text组件内容是:${this.num}`)})}.backgroundColor(Color.Red)GridItem() {Button('8', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {if (this.flagNum) {this.num = "8"} else {this.num = this.num == '0' ? "8" : this.num + "8"}this.flagNum = false;console.info(`text组件内容是:${this.num}`)console.info(`text组件内容是:${this.num}`)})}.backgroundColor(Color.Red)GridItem() {Button('9', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {if (this.flagNum) {this.num = "9"} else {this.num = this.num == '0' ? "9" : this.num + "9"}this.flagNum = false;console.info(`text组件内容是:${this.num}`)console.info(`text组件内容是:${this.num}`)})}.backgroundColor(Color.Red)GridItem() {Button('-', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {const flag = this.str[this.str.length - 1] === '='if (flag) {this.str = this.num + "-";} else {if (!this.flagNum) {const flag = this.str[this.str.length - 1] === '-'if (!flag) {this.str = this.num + "-";} else {const result = parseAndJian(this.str, this.num);this.num = result.toString();this.str = result.toString() + "-";}} else {const st = removeLastIfOperator(this.str) + "-";this.str = st;}}this.flagNum = true;console.info(`str组件内容是:${this.str}`)})}.backgroundColor(Color.Red)GridItem() {Button('4', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {if (this.flagNum) {this.num = "4"} else {this.num = this.num == '0' ? "4" : this.num + "4"}this.flagNum = false;console.info(`text组件内容是:${this.num}`)console.info(`text组件内容是:${this.num}`)})}.backgroundColor(Color.Red)GridItem() {Button('5', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {if (this.flagNum) {this.num = "5"} else {this.num = this.num == '0' ? "5" : this.num + "5"}this.flagNum = false;console.info(`text组件内容是:${this.num}`)console.info(`text组件内容是:${this.num}`)})}.backgroundColor(Color.Red)GridItem() {Button('6', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {if (this.flagNum) {this.num = "6"} else {this.num = this.num == '0' ? "6" : this.num + "6"}this.flagNum = false;console.info(`text组件内容是:${this.num}`)console.info(`text组件内容是:${this.num}`)})}.backgroundColor(Color.Red)GridItem() {Button('+', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {const flag = this.str[this.str.length - 1] === '='if (flag) {this.str = this.num + "+";} else {if (!this.flagNum) {const flag = this.str[this.str.length - 1] === '+'if (!flag) {this.str = this.num + "+";} else {const result = parseAndAdd(this.str, this.num);this.num = result.toString();this.str = result.toString() + "+";}} else {const st = removeLastIfOperator(this.str) + "+";this.str = st;}}this.flagNum = true;console.info(`str组件内容是:${this.str}`)})}.backgroundColor(Color.Red)GridItem() {Button('1', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {if (this.flagNum) {this.num = "1"} else {this.num = this.num == '0' ? "1" : this.num + "1"}this.flagNum = false;console.info(`text组件内容是:${this.num}`)console.info(`text组件内容是:${this.num}`)})}.backgroundColor(Color.Red)GridItem() {Button('2', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {if (this.flagNum) {this.num = "2"} else {this.num = this.num == '0' ? "2" : this.num + "2"}this.flagNum = false;console.info(`text组件内容是:${this.num}`)})}.backgroundColor(Color.Red)GridItem() {Button('3', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {if (this.flagNum) {this.num = "3"} else {this.num = this.num == '0' ? "3" : this.num + "3"}this.flagNum = false;console.info(`text组件内容是:${this.num}`)})}.backgroundColor(Color.Red)GridItem() {Button('=', { type: ButtonType.Normal, stateEffect: true}).width(80).height(160).onClick(() => {if (!this.flagNum) {const flag = this.str[this.str.length - 1] === '='if (!flag) {const lastChar = this.str[this.str.length - 1]; // 获取最后一个字符if (lastChar === '+') {const result = parseAndAdd(this.str, this.num);this.str = this.str + this.num + "=";this.num = result.toString();} else if (lastChar === '-') {const result = parseAndJian(this.str, this.num);this.str = this.str + this.num + "=";this.num = result.toString();} else if (lastChar === '*') {const result = parseAndCheng(this.str, this.num);this.str = this.str + this.num + "=";this.num = result.toString();} else if (lastChar === '/') {const result = parseAndChu(this.str, this.num);this.str = this.str + this.num + "=";this.num = result.toString();}}} else {const flag = this.str[this.str.length - 1] === '='if (flag) {if (this.str === '') {this.str = this.num + "="}return;}if (this.str === '') {this.str = this.num + "="return;}const st = removeLastIfOperator(this.str) + "=";this.str = st;}this.flagNum = true;console.info(`str组件内容是:${this.str}`)})}.rowStart(5) //开始第5行.rowEnd(6) //结束第6行.backgroundColor(Color.Red)GridItem() {Button('0', { type: ButtonType.Normal, stateEffect: true}).width(160).height(80).onClick(() => {if (this.flagNum) {this.num = "0"} else {this.num = this.num == '0' ? "0" : this.num + "0"}this.flagNum = false;console.info(`text组件内容是:${this.num}`)})}.columnStart(1) //第一列.columnEnd(2) //第二列.backgroundColor(Color.Grey)GridItem() {Button('.', { type: ButtonType.Normal, stateEffect: true}).width(80).height(80).onClick(() => {if (this.flagNum) {this.num = this.num+"."} else {if(this.str === ''){this.num = this.num+"."}else{this.num = this.num == '0' ? "0." : this.num + "."}}this.flagNum = false;console.info(`text组件内容是:${this.num}`)})}.backgroundColor(Color.Red)}.rowsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr') //行.columnsTemplate('1fr 1fr 1fr 1fr') //列.height('80%').width('90%')}.width('100%').height('100%').backgroundColor(Color.Yellow)}
}function parseAndAdd(str1: string, str2: string): number {// 尝试从第一个字符串中提取数字部分let num1 = parseFloat(removeLastIfOperator(str1)); // 移除所有非数字字符let num2 = parseFloat(str2); // 直接转换第二个字符串为数字// 现在我们可以相加这两个数字return num1 + num2;
}function parseAndJian(str1: string, str2: string): number {// 尝试从第一个字符串中提取数字部分let num1 = parseFloat(removeLastIfOperator(str1)); // 移除所有非数字字符let num2 = parseFloat(str2); // 直接转换第二个字符串为数字// 现在我们可以相加这两个数字return num1 - num2;
}function parseAndCheng(str1: string, str2: string): number {// 尝试从第一个字符串中提取数字部分let num1 = parseFloat(removeLastIfOperator(str1)); // 移除所有非数字字符let num2 = parseFloat(str2); // 直接转换第二个字符串为数字// 现在我们可以相加这两个数字return num1 * num2;
}function parseAndChu(str1: string, str2: string): number {// 尝试从第一个字符串中提取数字部分let num1 = parseFloat(removeLastIfOperator(str1)); // 移除所有非数字字符let num2 = parseFloat(str2); // 直接转换第二个字符串为数字// 现在我们可以相加这两个数字return num1 / num2;
}function removeLastIfOperator(str: string): string {const lastChar = str[str.length - 1]; // 获取最后一个字符const isOperator = ['+', '-', '*', '/'].includes(lastChar); // 判断是否是运算符if (isOperator) {return str.slice(0, -1); // 如果是运算符,则去除最后一个字符} else {return str; // 如果不是运算符,则返回原字符串}
}


http://www.ppmy.cn/news/1564418.html

相关文章

WPS excel使用宏编辑器合并 Sheet工作表

使用excel自带的工具合并Sheet表,我们会发现需要开通WPS会员才能使用合并功能; 那么WPS excel如何使用宏编辑器进行合并 Sheet表呢? 1、首先我们要看excel后缀是 .xlsx 还是 .xls ;如果是.xlsx 那么 我们需要修改为 .xls 注…

在 Azure 100 学生订阅中新建 Ubuntu VPS 并部署 Mastodon 服务器

今天想和大家分享一下如何在 Azure 的 100 学生订阅中,创建一台 Ubuntu VPS,并通过 Docker 部署 Mastodon 服务器。Mastodon 是一个开源的社交网络平台,允许用户创建自己的实例,类似于 Twitter,但更加去中心化。Docker…

计算机网络 (45)动态主机配置协议DHCP

前言 计算机网络中的动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)是一种网络管理协议,主要用于自动分配IP地址和其他网络配置参数给连接到网络的设备。 一、基本概念 定义:DHCP是一种网络协议&#xf…

FPGA车牌识别

基于FPGA的车牌识别主要包含以下几个步骤:图像采集、颜色空间转换、边缘检测、形态学处理(腐蚀和膨胀)、特征值提取、模板匹配、结果显示。先用matlab对原理进行仿真,后用vivado和modelsim进行设计和仿真。 一、1.图像采集采用ov…

css 实现自定义虚线

需求: ui 画的图是虚线,但是虚线很宽正常的border 参数无法做到 进程: 尝试使用 border:1px dashed 发现使用这个虽然是虚线但是很短密密麻麻的 这并不是我们想要的那就只能换方案 第一个最简单,让ui 画一个图然…

复健第二天之[SWPUCTF 2022 新生赛]xff

打开题目在线环境可以看到: 然后根据提示从自己的电脑上进入并且题目提示了xff,这里利用hackbar添加X-Forwarded-For:127.0.0.1(伪装主机ip) 再根据这个页面添加 Referer:127.0.0.1(跳转前地址…

如何在谷歌浏览器中设置自定义安全警告

随着网络环境的日益复杂,浏览器的安全问题也愈发引人关注。谷歌浏览器作为一款广泛使用的浏览器,其自定义安全警告功能为用户提供了更加个性化和安全的浏览体验。本文将详细介绍如何在谷歌浏览器中设置自定义安全警告,帮助用户更好地保护自己…

Linux 常用命令——文件目录篇(保姆级说明)

文件及目录类 列出当前目录中的文件和子目录(ls) ls [-参数] [name...]# 列出所有根目录 ls /# 列出所有txt文件 ls *.txt参数: -a 显示所有文件及目录 (. 开头的隐藏文件也会列出) -d 只列出目录(不递归列出目录内的文件)。 -l…