鸿蒙应用简单计算器代码及演示

复制代码
@Entry
@Component
struct Index {
  @State result: string[] = ['0']

  setParams(pattern: string) {
    const operators: string = '+-*/.'
    if (this.result.length == 1 && this.result[0] == '0') {
      if ('*/'.includes(pattern)) return
      this.result = [pattern]
    } else {
      const len = this.result.length
      const last = this.result.lastIndexOf('.')
      const slice = this.result.slice(last + 1)
      if (last != -1 && pattern == '.' && /^\d+$/.test(slice.join(''))) return
      if(!(operators.includes(this.result[len-1]) && operators.includes(pattern)))
      {
        this.result.push(pattern)
      }
    }
  }

  calc() {
    let res = 0
    const dd = this.result.join('').match(/[\-\+]?\d+(\.\d+)?([\/\*]\d+(\.?\d+)?)*/g)
    dd.forEach(item => {
      if (/^[\+\-]?\d+(\.\d+)?$/.test(item)) {
        res += +item
      } else {
        let rr = 0
        let isj = false
        let operator: string = "*"
        let rrr = item.match(/[\/\*]|(\d+(\.\d+)?)/g)
        for (let index = 0; index < rrr.length; index++) {
          const element = rrr[index];
          if (element == '-') {
            isj = true
          } else if ('*/'.includes(element)) {
            operator = element
          } else {
            if (rr == 0) {
              rr = +element
              continue
            }
            if (operator == '*') {
              rr *= +element
            } else {
              rr /= +element
            }
          }
          if (isj) {
            rr = 0 - rr
          }
        }
        res += rr
      }

    })
    this.result = [res + '']
  }
  
  
  build() {
    Grid() {
      GridItem() {
        Text(this.result.join(''))
          .padding(10)
          .height('100%')
          .width('100%')
          .fontColor('#000000')
          .textAlign(TextAlign.End)
          .fontSize(50)

      }
      .columnStart(1)
      .columnEnd(4)
      .backgroundColor('#FFC0CB')

      GridItem() {
        Button('CE')
          .type(ButtonType.Normal)
          .height('100%')
          .width('100%')
          .fontColor('#000000')
          .backgroundColor('#FFC0CB')
          .onClick(() => {
            if (this.result.length == 1) {
              if (this.result[0] == '0') return
              this.result = ['0']
              return
            }
            this.result.pop()
          })
      }

      GridItem() {
        Button('C')
          .type(ButtonType.Normal)
          .height('100%')
          .width('100%')
          .fontColor('#000000')
          .backgroundColor('#FFC0CB')
          .onClick(() => {
            this.result = ['0']
          })
      }

      GridItem() {
        Button('/')
          .type(ButtonType.Normal)
          .height('100%')
          .width('100%')
          .fontColor('#000000')
          .backgroundColor('#FFC0CB')
          .onClick(() => {
            this.setParams('/')
          })
      }
      .backgroundColor('#FFC0CB')

      GridItem() {
        Button('*')
          .type(ButtonType.Normal)
          .height('100%')
          .width('100%')
          .fontColor('#000000')
          .backgroundColor('#FFC0CB')
          .onClick(() => {
            this.setParams('*')
          })
      }

      ForEach(['7', '8', '9'], (item: string) => {
        GridItem() {
          Button(item)
            .type(ButtonType.Normal)
            .height('100%')
            .width('100%')
            .fontColor('#000000')
            .backgroundColor('#FFC0CB')
            .onClick(() => {
              this.setParams(item)
            })
        }
      }, item => item)


      GridItem() {
        Button('-')
          .type(ButtonType.Normal)
          .height('100%')
          .width('100%')
          .fontColor('#000000')
          .backgroundColor('#FFC0CB')
          .onClick(() => {
            this.setParams('-')
          })
      }

      ForEach(['4', '5', '6'], (item: string) => {
        GridItem() {
          Button(item)
            .type(ButtonType.Normal)
            .height('100%')
            .width('100%')
            .fontColor('#000000')
            .backgroundColor('#FFC0CB')
            .onClick(() => {
              this.setParams(item)
            })
        }
      }, item => item)

      GridItem() {
        Button('+')
          .type(ButtonType.Normal)
          .height('100%')
          .width('100%')
          .fontColor('#000000')
          .backgroundColor('#FFC0CB')
          .onClick(() => {
            this.setParams('+')
          })
      }

      ForEach(['1', '2', '3'], (item: string) => {
        GridItem() {
          Button(item)
            .type(ButtonType.Normal)
            .height('100%')
            .width('100%')
            .fontColor('#000000')
            .backgroundColor('#FFC0CB')
            .onClick(() => {
              this.setParams(item)
            })
        }
      }, item => item)

      GridItem() {
        Button('=')
          .type(ButtonType.Normal)
          .height('100%')
          .width('100%')
          .fontColor('#000000')
          .backgroundColor('#FFC0CB')
          .onClick(() => {
            this.calc()
          })
      }
      .rowStart(5)
      .rowEnd(6)
      .backgroundColor('#FFC0CB')

      GridItem() {
        Button('0')
          .type(ButtonType.Normal)
          .height('100%')
          .width('100%')
          .fontColor('#000000')
          .backgroundColor('#FFC0CB')
          .onClick(() => {
            this.setParams('0')
          })
      }
      .columnStart(1)
      .columnEnd(2)

      GridItem() {
        Button('.')
          .type(ButtonType.Normal)
          .height('100%')
          .width('100%')
          .fontColor('#000000')
          .backgroundColor('#FFC0CB')
          .onClick(() => {
            this.setParams('.')
          })
      }
    }
    .columnsGap(10)
    .rowsGap(10)
    .padding(10)
    .rowsTemplate('2fr 1fr 1fr 1fr 1fr 1fr')
    .columnsTemplate('1fr 1fr 1fr 1fr')
    .backgroundColor('#FFFFFF')
  }
}

效果图:

编辑器为Dev Eco

相关推荐
TT_Close1 小时前
【Flutter×鸿蒙】debug 包也要签名,这点和 Android 差远了
android·flutter·harmonyos
TT_Close17 小时前
【Flutter×鸿蒙】FVM 不认鸿蒙 SDK?4步手动塞进去
flutter·swift·harmonyos
hqk19 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
TT_Close19 小时前
【Flutter×鸿蒙】一个"插队"技巧,解决90%的 command not found
flutter·harmonyos
茶杯梦轩1 天前
从零起步学习RabbitMQ || 第二章:RabbitMQ 深入理解概念 Producer、Consumer、Exchange、Queue 与企业实战案例
服务器·后端·消息队列
Hcourage2 天前
鸿蒙工程获取C/C++代码覆盖
harmonyos
二流小码农2 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
万少3 天前
HarmonyOS 开发必会 5 种 Builder 详解
前端·harmonyos
阿白的白日梦3 天前
winget基础管理---更新/修改源为国内源
windows
YuMiao3 天前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议