버튼 영역을 어떻게 준비해야하나

  • 1~9번까지
  • 0과 =
  • C - + 부분
<View style={styles.buttonContainer}>
	<View style={styles.leftPad}>
		<View style={styles.number}></View>
		<View style={styles.bottom}></View>
	</View>
	<View style={styles.operator}></View>
</View>

일단 위와 같이 대략적인 구분선을 만들어두고

buttonContainer: {
    flex: 1,
    flexDirection: 'row',
    backgroundColor: 'skyblue',
},
leftPad: {},
number: {},
bottom: {
  flexDirection: 'row',
},
operator: {},

위와 같이 설정해둔다.

크기 세팅하기

useWindowDimensions 라는 애를 사용하면 이 디바이스의 크기를 가져올 수 있다.

const width = useWindowDimensions().width / 4;

너비의 4분의 1만 가져오는 코드

<Button
	title="1"
	onPress={() => {}}
	buttonStyle={{ width, height: width }}
></Button>

구분선 주기

버튼을 네개를 만들고

height를 줬는데 이를 동적으로 변경하려면 크게 위 아래 두부분으로 나뉘었던 부분을 윗 부분만 flex를 줘서 아랫부분은 동적으로 준다.

그 후 구분선을 주고 싶다면 borderWidth를 쓰게 되면 두개가 겹치게 되는 순간 더 굵게 표시되므로

적당한 간격으로 띄우는 것을 추천한다.

아래와 같이 설정해주면 된다.

1. 먼저 공간을 주기 위해 width 설정

const width = (useWindowDimensions().width - 5) / 4;

2. 그 후 margin-bottom을 주기

<Button
	title="1"
	onPress={() => {}}
	buttonStyle={{ width, height: width, marginBottom: 1 }}
></Button>

버튼 배치하기

flex-wrap이란 걸 사용하면 자동으로 줄바꿈해준다.

number: {
    flexDirection: 'row',
    flexWrap: 'wrap-reverse',
    justifyContent: 'space-evenly',
  },

위와 같이 wrap -reverse로 사용하면 순서도 바꿀 수 있다.

버튼 이벤트 만들기

숫자를 변동시키기 위해선 state 변경함수를 활용하여

const onPressNumber = num => {
	setResult(prev => prev * 10 + num);
};

위와 같이 코드를 만들어주면 숫자가 바뀌는 것을 확인할 수 있다.

또한 세자리마다 콤마를 찍어주고 싶다면

{
	result.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}

위와 같이 정규표현식으로 진행한다.

계산식 만들기

계산식에 대하여… 배열로 받아서 [ 숫자, 연산자, 숫자 ] 식으로 받아올 것이다.

// 공식 배열
const [formular, setFormular] = useState([]);

const onPressNumber = num => {
	console.log(formular);
	const last = formular[formular.length - 1];

	// 숫자가 아닐 땐 교체해줌.
	if (isNaN(last)) {
		setResult(num);
		setFormular(prev => [...prev, num]);
	} else {
		// 숫자가 일 땐 다음자리로 더해줌
		const newNum = (last ?? 0) * 10 + num;
		setResult(newNum);
		setFormular(prev => {
			prev.pop();
			return [...prev, newNum];
		});
	}
};

// 연산자의 종류에 맞게 공식 배열에 넣어줌.
const onPressOperator = operator => {
	console.log(formular);
	switch (operator) {
		case Operators.CLEAR:
			setResult(0);
			setFormular([]);
			break;
		case Operators.EQUAL:
			//TODO
			break;
		default:
			// +, -
			const last = formular[formular.length - 1];
			if ([Operators.PLUS, Operators.MINUS].includes(last)) {
				setFormular(prev => {
					prev.pop();
					return [...prev, operator];
				});
			} else {
				setFormular(prev => [...prev, operator]);
			}
			// TODO
			break;
	}
};