UNPKG

@ttk/component

Version:

ttk组件库

112 lines (110 loc) 3.86 kB
import React, { PureComponent } from 'react'; import ResultPanel from './ResultPanel'; import ButtonPanel from './ButtonPanel'; import { Button } from 'antd' import { math } from '@ttk/utils' export default class Calculator extends PureComponent { constructor() { super(); this.state = { last: '', cur: '0' }; this.onButtonClick = this.onButtonClick.bind(this); } eval = (body) => { return new Function("return " + body)(); } onButtonClick(type) { var cur; var lastLetter; switch (type) { case 'c': this.setState({ last: '', cur: '0' }); break; case 'back': this.setState({ cur: this.state.cur === '0' ? this.state.cur : this.state.cur.slice(0, -1) || '0' }); break; case '=': try { this.setState({ last: this.state.cur + '=', cur: this.mathRound(this.eval(this.state.cur), 2) + '' }); } catch (e) { this.setState({ last: this.state.cur + '=', cur: 'NaN' }); } break; case '+': case '-': case '*': case '/': cur = this.state.cur; lastLetter = cur.slice(-1); if (lastLetter === '+' || lastLetter === '-' || lastLetter === '*' || lastLetter === '/') this.setState({ cur: cur.slice(0, -1) + type }); else this.setState({ cur: this.state.cur + type }); break; case '.': cur = this.state.cur; lastLetter = cur.slice(-1); if (lastLetter !== '.') { this.setState({ cur: this.state.cur + type }); } break; default: this.setState({ cur: this.state.cur === '0' ? type : this.state.cur + type }); break; } } mathRound = (num, digit = 2) => { return math(math(num, 4), digit) } confirm = () => { this.props.closeModal() if (!this.state.last) { try { this.state.cur = this.mathRound(this.eval(this.state.cur), 2) + '' } catch (e) { this.state.cur = 0 } } this.props.callBack(this.state.cur ? this.state.cur : 0) } cancel = () => { this.props.closeModal() } render() { var exp = { cur: this.state.cur, last: this.state.last }; return ( <div className="react-calculator"> <ResultPanel exp={exp} /> <ButtonPanel onClick={this.onButtonClick} confirm={this.confirm} /> <div style={{ width: '100%', textAlign: 'right', paddingTop: '12px', paddingRight: '12px', paddingBottom: '12px', borderTop: '1px solid #ddd' }}> <Button className='button' style={{ marginRight: '8px', fontSize: '13px', padding: '0px 15px' }} type='primary' onClick={this.confirm}>确定</Button> {/* <Button onClick={this.cancel} style={{fontSize: '13px',padding:'0px 15px'}}>取消</Button> */} </div> </div> ); } }