Uniapp之微信小程序计算器

news2024/9/23 9:25:29

UI仿的iOS手机计算器,基本功能已经实现,如下效果图

 具体使用可以参考微信小程序:日常记一记--我的---计算器

第一步:UI界面设计

  1,strClass模块是计算过程代码展示

  2,result-view模块是结果展示

 3,btns-view模块是计算器按钮模块

<view class="content">
	<view class="strClass">{{str}}</view>
	<view class="result-view">
		<input class="result-box" type="text" v-model="number" disabled="true" :style="{fontSize: curFontSize}" />
	</view>
	<view class="btns-view">
		<view v-for="(item,index) in buttons" :key="item.text" :class="[item.flag==false ? item.class:(item.class +' active')]"  @click="jsqButton(item)">{{item.text}}</view>
	</view>
</view>

4,js赋初始值

 export default {
        data() {
            return {
                number: '0', //计算器显示区域值
                str:"0",//计算过程初始值
   	           buttons: [{//按键集合
							 text: 'AC',
							 type: 'clear',
							 class: 'ft-color bg-gray ml-zero btn-radius',
							 params: 'clear',
							 flag: false,
							},
							{
							 text: '+/-',
							 type: 'operator',
							 class: 'ft-color bg-gray btn-radius',
							 params: 'opposite',
							 flag: false,
							 },
							 {
							 text: '%',
							 type: 'operator',
							 class: 'ft-color bg-gray btn-radius',
							 params: 'percent',
							 flag: false,
							 },
							 {
							 text: '÷',
							 type: 'operator',
							 class: 'bg-orange btn-radius',
							 params: 'divide',
							 flag: false,
							 },
							 {
							 text: '7',
							 type: 'num',
							 class: 'bg-darkgray ml-zero btn-radius',
							 params: '7',
							 flag: false,
							 },
							 {
							 text: '8',
							 type: 'num',
							 class: 'bg-darkgray btn-radius',
							 params: '8',
							 flag: false,
							 },
							 {
							 text: '9',
							 type: 'num',
							 class: 'bg-darkgray btn-radius',
							 params: '9',
							 flag: false,
							 },
							 {
							 text: '×',
							 type: 'operator',
							 class: 'bg-orange btn-radius',
							 params: 'multiply',
							 flag: false,
							 },
							 {
							 text: '4',
							 type: 'num',
							 class: 'bg-darkgray ml-zero btn-radius',
							 params: '4',
							 flag: false,
							 },
							 {
							 text: '5',
							 type: 'num',
							 class: 'bg-darkgray btn-radius',
							 params: '5',
							 flag: false,
							 },
							 {
							 text: '6',
							 type: 'num',
							 class: 'bg-darkgray btn-radius',
							 params: '6',
							 flag: false,
							 },
							 {
							 text: '-',
							 type: 'operator',
							 class: 'bg-orange btn-radius',
							 params: 'minus',
							 flag: false,
							 },
							 {
							 text: '1',
							 type: 'num',
							 class: 'bg-darkgray ml-zero btn-radius',
							 params: '1',
							 flag: false,
							 },
							 {
							 text: '2',
							 type: 'num',
							 class: ' bg-darkgray btn-radius',
							 params: '2',
							 flag: false,
							 },
							 {
							 text: '3',
							 type: 'num',
							 class: ' bg-darkgray btn-radius',
							 params: '3',
							 flag: false,
							 },
							 {
							 text: '+',
							 type: 'operator',
							 class: 'bg-orange btn-radius',
							 params: 'plus',
							 flag: false,
							 },
							 {
							 text: '0',
							 type: 'num',
							 class: 'btn-size2 bg-darkgray ml-zero',
							 params: '0',
							 flag: false,
							 },
							 {
							 text: '.',
							 type: 'string',
							 class: 'bg-darkgray btn-radius',
							 params: '.',
							 flag: false,
							 },
							 {
							 text: '=',
							 type: 'equal',
							 class: 'bg-orange btn-radius',
							 params: 'result',
							 flag: false,
						 }
					  ]
					 
				 }
              },
       

           }

       }
   }

5,css

.uni-popup-calculator {
	background-color: #333333;
}
.uni-popup-calculator-title {
	background-color: #ccc;
	font-size: 50rpx;
	font-weight: 600;
	color: #FFFFFF;
	view{
		width: 100%;
		height: 120rpx;
		padding: 24rpx;
		box-sizing: border-box;
	}
}

.uni-popup-content {
	width: 750rpx;
	background-color: #FFFFFF;
	display: flex;
	flex-direction: row;
	justify-content: flex-start;
	align-items: flex-start;
	flex-wrap: wrap;

	.uni-popup-cell {
		width: 186rpx;
		height: 98rpx;
		line-height: 98rpx;
		text-align: center;
		font-size: 44rpx;
		font-weight: 600;
		color: #333333;
		border-bottom: 1px solid #f5f5f5;
		border-left: 1px solid #f5f5f5;
		box-sizing: border-box;
	}

	.uni-popup-cell.cur {
		width: 372rpx;
	}

	.uni-popup-cell.border {
		border-left: none;
	}

	.uni-popup-cell.active {
		background-color: #f5f5f5;
	}
}

到这里,计算器UI效果图基本就出来了

第二步,添加相应功能 

         1,字体大小控制

return {
    curFontSize:'180rpx',//初始大小
 }

        2,自动控制大小

watch: { 
  number(newVal, oldVal) {
	newVal += "";
	switch (newVal.length) {
	    case 8:
		this.curFontSize = "160rpx";
		break;
	    case 9:
		this.curFontSize = "150rpx";
		break;
	    case 10:
		this.curFontSize = "140rpx";
		break;
	    case 11:
		this.curFontSize = "120rpx";
		break;
	    default:
		this.curFontSize = "180rpx";
		break;
	}
    }
},

 效果如下

3,定义赋值

return {
	numberOne: '', //变量一
	numberTwo: '', //变量二
	symbol: '', //运算符
	complete: false, //判断是否完成一次计算
	moreAdd:false,//判断是否连续计算
	current: -1,
	number:'0',
	str:'',
	symbol:'',
	curFontSize:'180rpx',
 }

 4,计算加减乘除等方法

//计算器方法:
jsqButton(item) {
	let that = this;
	//按键点击效果
	item.flag = true;
	setTimeout(() => {
		item.flag = false;
	}, 200);
	//判断输入的第一位是否是小数点
	switch (item.type) {
		case 'string':
			//小数点
			if (that.complete) {
				that.number = '0';
				that.complete = false;
			}
			if (that.symbol) {
				if ((that.number).indexOf('.') == -1) {
					that.numberTwo = that.numberTwo + '.';
					that.number = that.numberTwo;
				}
			} else {
				if ((that.number).indexOf('.') == -1) {
					that.number = that.number + '.';
				}
			}
			break;
		case 'num':
			//数字
			if (that.complete) {
				that.number = '0';
				that.complete = false;
			}
			if (that.symbol) {
				that.numberTwo += item.params;
				that.number = that.numberTwo;
			} else {
				if (that.number == '0') {
					that.number = item.params;
				} else {
					that.number += item.params;
				}
			}
			break;
		case 'operator':
		    if(that.moreAdd){
				that.jsqResult();
			 }else{
				that.moreAdd=true; 
			 }
			//运算符
			that.symbol = item.text;
			// 改变正负
			// 负负得正
			if (item.params == "opposite") {
				that.number = -that.number;
				break;
			} 
			if (item.text != '%') {
				that.numberOne = that.number;
				that.numberTwo = '';
			} else {
				that.number = parseFloat(that.number) / 100;
			}
			break;
		case 'equal': //等号 
			that.jsqResult();
			that.moreAdd=false;
			break;
		case 'clear': //清除符
			that.clear();
			break;
	}
	if(!this.numberOne && !this.complete){
		this.str = this.number
	}else if(!this.complete){
		this.str = this.numberOne + this.symbol + this.numberTwo
	}
},
/*** 计算结果* */
jsqResult(){
      let that = this;
	if (that.symbol == '-') {
		that.number = that.subtraction(that.numberOne, that.numberTwo);
	} else if (that.symbol == '+') {
		that.number = that.addition(that.numberOne, that.numberTwo);
	} else if (that.symbol == '×') {
		that.number = that.multiplication(that.numberOne, that.numberTwo);
	} else if (that.symbol == '÷') {
		that.number = that.division(that.numberOne, that.numberTwo);
	} else if (that.symbol == '%') {
		that.number = parseFloat(that.number) / 1;
	}
	this.str = this.numberOne + this.symbol + this.numberTwo + '='
	that.complete = true;
	that.numberOne = '';
	that.numberTwo = '';
	that.symbol = '';
},
/*** 清除* */
clear() {
	let that = this;
	that.number = '0';
	that.str = '0';
	that.numberOne = '';
	that.numberTwo = '';
	that.symbol = '';
	that.compile = false;
},
division(arg1, arg2) {
	var t1 = 0,
		t2 = 0,
		r1, r2;
	try {
		t1 = arg1.toString().split(".")[1].length
	} catch (e) {}
	try {
		t2 = arg2.toString().split(".")[1].length
	} catch (e) {}
	Math.r1 = Number(arg1.toString().replace(".", "")) 
	Math.r2 = Number(arg2.toString().replace(".","")) 
	return (Math.r1 / Math.r2) * Math.pow(10, t2 - t1);
},
/*** 乘法* */
multiplication(arg1, arg2) {
	var m = 0,
		s1 = arg1.toString(),
		s2 = arg2.toString();
	try {
		m += s1.split(".")[1].length
	} catch (e) {}
	try {
		m += s2.split(".")[1].length
	} catch (e) {}
	return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
},
/*** 加法* */
addition(arg1, arg2) {
	var r1, r2, m;
	try {
		r1 = arg1.toString().split(".")[1].length;
	} catch (e) {
		r1 = 0;
	}
	try {
		r2 = arg2.toString().split(".")[1].length;
	} catch (e) {
		r2 = 0;
	}
	m = Math.pow(10, Math.max(r1, r2));
	return (arg1 * m + arg2 * m) / m;
},
/*** 减法* */
subtraction(arg1, arg2) {
			var r1, r2, m, n;
			try {
				r1 = arg1.toString().split(".")[1].length;
			} catch (e) {
				r1 = 0;
			}
			try {
				r2 = arg2.toString().split(".")[1].length;
			} catch (e) {
				r2 = 0;
			}
			m = Math.pow(10, Math.max(r1,
				r2
			)); //last modify by deeka//动态控制精度长度
			n = (r1 >= r2) ? r1 : r2;
			return ((arg1 * m - arg2 * m) / m).toFixed(n);
 },

 最终所有代码截图

 

 

至此所有功能已经书写完毕,加减乘除,清除,正负,百分比,点击按钮背景改变如下图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2036767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式学习---DAY24:进程--二

一、exec函数族----启动一个新程序 用fork创建子进程后执行的是和父进程相同的程序&#xff08;但有可能执行不同的代码分支&#xff09;&#xff0c; 子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的 用户空间代码和数据完全被…

SHT30温湿度传感器全解析——概况,性能,MCU连接,样例代码

常见温湿度传感器测量范围&#xff1a;(价格仅供参考&#xff0c;具体性能要看折线图) 型号DHT11DHT20AHT10AHT20AHT30SHT20价格&#xffe5; 2.49&#xffe5;3.04&#xffe5; 1.9&#xffe5;1.4&#xffe5; 1.3&#xffe5;5.5温度测量范围20—90%RH0—100%RH0—100%RH0—…

pycharm最新专业版激活码

pycharm最新专业版激活码 Pycharm下载地址&#xff1a;pycharm下载 首先&#xff0c;我们打开下载的 pycharm 专业版并安装。 按照下图所示先点击上方的 Activation code&#xff0c;再将激活码粘贴至输入框&#xff0c;最后点击 Activate 激活。 激活码&#xff1a; OS2AN…

旋转关系介绍

目录 旋转矩阵与轴角 旋转矩阵与欧拉角 旋转矩阵与四元数 轴角与四元数 轴角与欧拉角 欧拉角与四元数 欧拉角与四元数 旋转矩阵与轴角 设旋转矩阵R[■8(r_11&r_12&r_13r_21&r_22&r_23r_31&r_32&r_33)]&#xff0c;轴角使用一个单位向量n和一个角…

Go--GMP调度模型

目录 GMP模型G、M、P简介P和M的个数**P和M何时会被创建**goroutine创建流程goroutine什么时候会被挂起 GMP的调度调度流程调度策略调度时机同时启动了一万个goroutine&#xff0c;会如何调度&#xff1f; GMP模型 G、M、P简介 GMP是Go运行时调度层面的实现&#xff0c;包含4个…

质量对中国开发商提升游戏品牌信誉和信任度的影响

随着全球游戏产业的持续增长&#xff0c;中国开发商正在大举进军国际市场。然而&#xff0c;他们面临的关键挑战之一是建立和维护与全球参与者的品牌信誉和信任。他们的游戏质量在实现这一目标方面起着至关重要的作用。从技术性能到故事讲述和本地化&#xff0c;高质量的游戏对…

OpenGL3.3_C++_Windows(35)

PBR_IBL漫反射 IBL图像的光照(Image based lighting&#xff09;&#xff1a;非直接光源&#xff0c;它是一种更精确的环境光照输入格式&#xff0c;甚至也可以说是一种全局光照的粗略近似。环境光照&#xff1a;获取每个wi光源辐射率&#xff0c;求辐照度&#xff1a;将周围环…

Linux学习笔记11(计算机网络)

目录 网络七层模型/五层模型 IP地址分类 CIDR Centos7的网卡IP配置 RockyLinux9的网卡IP配置 网络七层模型/五层模型 自下到上 物理层&#xff1a; 建立物理连接&#xff0c;传输 0 和 1 的比特流 数据链路层&#xff1a; 物理地址寻址&#xff0c;流量控制&#xff0c;差错…

基于vue框架的SSM基于B_S的毕业设计题目管理系统的设计与实现ij0q7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,教师,毕设题目,毕设选题,毕设任务书,开题报告,中期检查,毕业论文,论文成绩,答辩成绩,答辩通知,班级 开题报告内容 基于Vue框架的SSM&#xff08;SpringSpring MVCMyBatis&#xff09;的毕业设计题目管理系统设计与实现 开题报告…

刷题记录第109天-K个一组反转链表

解题思路&#xff1a; 第一步&#xff1a;实现一个数组&#xff0c;给定一段链表的头结点和尾节点&#xff0c;反转该链表&#xff0c;并返回新的头结点和尾结点。 第二步&#xff1a;初始化一个虚拟头结点&#xff0c;用于记录最终头结点和规范操作。 第三步&#xff1a;给定一…

​产品经理-​你如何理解“互联网思维(35)

在产品规划和功能改版中&#xff0c;确实非常重视用户需求和体验。产品需求是互联网产品的核心 用户体验是互联网产品的重点。在互联网新产品规划中&#xff0c;会非常重视用户验证环节 确保做出来的东西确实是用户想要的&#xff1b;而在已经上线的产品中&#xff0c;往往会有…

Raspberry Pi Pico 家族的进化 —— RP2040、RP2350与RP2354性能比较

随着树莓派Pico系列的不断扩展&#xff0c;其背后的芯片也得到了升级和改进。从最初的RP2040到最新的RP2354&#xff0c;每一次迭代都带来了新的功能和性能提升。本文将详细对比RP2040、RP2350和RP2354三款芯片的关键特性&#xff0c;帮助开发者了解它们的差异&#xff0c;并选…

Windows File Recovery卡在99%怎么解决?实用指南!

为什么会出现“Windows File Recovery卡在99%”的问题&#xff1f; Windows File Recovery&#xff08;Windows文件恢复&#xff09;是微软设计的命令行应用程序。它可以帮助用户从健康/损坏/格式化的存储设备中恢复已删除/丢失的文件。 通过输入相关命令&#xff0c;设置源/…

【轨物推荐】技术创新的演进逻辑

注&#xff1a;本文节选自郭朝晖老师的《知行-工业基因的数字化演进》 推进数字化技术的过程本质上是一种技术创新。理解创新的逻辑&#xff0c;有利于推进数字化技术。 科技工作的价值往往短期被高估&#xff0c;长期被低估。短期被高估&#xff0c;是因为忽视了技术应用过程…

LSPosed模块开发第一篇

安装LSPosed 设备pixel 3a Android 12 Magisk root 环境 LSPosed地址&#xff1a; https://github.com/LSPosed/LSPosed 下载zygisk的&#xff0c;riru没效果 https://github.com/LSPosed/LSPosed/releases 下载完push 到手机&#xff0c;Magisk 安装模块 Magisk设置里面的Z…

【人工智能】【机器学习】- 好书推荐之《深度学习调参指南》

目录 目标读者 核心内容 特色 结构 《深度学习调参指南》是一份由Google和哈佛大学的研究人员与工程师共同编写的实战手册&#xff0c;旨在帮助读者系统性地优化深度学习模型的性能。该指南强调了在深度学习实践中遇到的实际问题和解决方案&#xff0c;尤其关注超参数调优的…

go-zero结合自定义模版校验前端参数

一、自定义模版的使用 如果想对官网goctl命名生成的项目结构改变的话,可以使用模版&#xff0c;自定义模版,然后生成自己想要的文件 1、使用命令将官方模版映射到本地 goctl template init2、在项目的根目录下添加文件夹,把刚刚映射到本地的拷贝到项目中 3、使用模版根据api文…

luckyexcel 编辑预览excel文件

luckyexcel 编辑预览excel文件 支持后端传文件流预览编辑&#xff0c;也支持选择本地文件编辑预览 看效果 上代码 <template><div style"margin: 30px"><div class"button-box2"><div><div style"color: red">…

【精通SDL之----SDL_RenderReadPixels截屏】

SDL_RenderReadPixels截屏 前言一、SDL_RenderReadPixels简介二、问题现象三、规避方案1. 离屏纹理2. ding! *灵光一现* 前言 最近使用SDL2在鸿蒙系统(Harmoney OS)上截取视频播放过程中的数据&#xff0c;发现捕获的数据为空&#xff0c;然在windows上却可以正常捕获&#xff…

Linux 内核源码分析---网络层分析

版本(version)&#xff1a;指定所用 IP 协议的版本&#xff0c;该字段有效值为 4 或 6&#xff1b; IP首部长度(IHL)&#xff1a;定义首部的长度&#xff0c;由于选项数量可变&#xff1b; 服务区分&#xff1a;用于更复杂协议选项&#xff1b; 长度&#xff1a;指定分组的总长…