input pattern 활용

soo's·2023년 4월 26일
0

0. input의 pattern 속성

나는 숫자 입력값을 받았을 때, 3자리 단위마다 ,를 넣은 형태로 보여주는 input을 만들려고한다.

여러 방법을 찾아보다가 input 태그의 속성으로 pattern을 사용할 수 있다는 것을 알게됐다.
pattern 속성은 HTML5에서 추가된 속성으로, input 요소의 값을 검증하는데 사용된다. 정규표현식 패턴을 입력받아 해당 패턴에 맞는 문자열만 입력 가능하도록 제한하는 속성이다.
예를 들어, pattern 속성에 ^[a-zA-Z]*$와 같은 정규표현식을 지정하면, 입력 가능한 값이 알파벳 대문자 또는 소문자로만 이루어진 문자열로 제한됨.
또한, 입력값이 올바르지 않을 때 표시될 오류 메시지를 title 속성을 사용하여 작성 가능함. pattern 속성은 required 속성과 함께 사용하면, 필수 입력 값이 지정된 패턴에 맞지 않을 경우에도 오류 메시지를 표시할 수 있다.

// input pattern 예시
<label>
  주민등록번호:
  <input type="text" name="jumin" pattern="^[0-9]{6}-[1-4]{1}[0-9]{6}$" required title="주민등록번호를 올바르게 입력하세요. (예: 123456-1234567)" />
</label>

따라서 나는 위와 같은 속성을 이용해서 입력값이 1~3자리 숫자와 , 그리고 세자리 숫자가 반복되는 패턴의 문자열만 받으려고 한다.

<input type="text" pattern= "\d{1,3}(,\d{3})*"

이렇게 작성하고

function Inputs({ smallBtnList }) {
  const [data, setData] = useState({ name: "", price: 0 });

  const handleChange = (e) => {
    const { id, value } = e.target;
    let price = value;
    if (id === "price" && !!price) {
      price = parseFloat(value.replace(/,/g, ""));
      price = price.toLocaleString();
    }
    setData({ ...data, [id]: price });
  };

  const handleClickSave = (e) => {
    if (data.name.length < 1 || data.price.length < 1) {
      return alert("이름과 가격 모두 입력해주세요!");
    }
    alert(`name : ${data.name} price : ${data.price}`);
  };

  return (
    <StForm>
      <label htmlFor="name">이름</label>
      <StInp value={data.name} id="name" type="text" placeholder="이름을 입력하세요." onChange={handleChange} />
      <label htmlFor="price">가격</label>
      <StInp pattern="\d{1,3}(,\d{3})*" value={data.price} id="price" type="text" placeholder="가격을 입력하세요." onChange={handleChange} />
      <Btns btnList={smallBtnList} handleClickSave={handleClickSave} />
    </StForm>
  );
}

0개의 댓글