오늘 한 일

과제

1. 출장 정보 수정, 생성 시 금액 입력칸 및 합계에 천 자리 콤마 표시 추가


그냥 숫자가 아닌 금액을 입력, 출력하는 부분에 천 자리 콤마를 추가하였다. 숫자를 받아 로컬 화폐 기준으로 콤마를 넣은 문자열로 반환하는 함수 toLocaleString() 가 있어서 사용했는데, 합계 연산을 할 때 문자열을 숫자로 다시 변환해주어야 하는 문제가 있었다. 처음엔 그걸 몰라서 input에 콤마가추가되는 순간 합계에 NaN이 들어가버리는 이유를 몰랐다.
javascript에서는 문자열에 * 1을 해주면 숫자로 형변환이 된다.

$(document).ready(function () {  
  // 금액 합계 기능
  function setTotalPrice() {
    var total = 0;
    $(".PRICE").each(function() {
      total += $(this).val().replace(/\D/g,'') * 1;
    });
    // 합계 출력
    $("#priceTotal").html(total.toLocaleString());
  }
  setTotalPrice();

  // 금액 입력 시 숫자 아닌 것 지우고 합계 업데이트
  $('.PRICE').keyup(function(e){
    if (/\D/g.test(this.value)){
      this.value = this.value.replace(/\D/g, '');
    }
    this.value = (this.value * 1).toLocaleString();
    setTotalPrice();
  });       
});

2. 금액 있는데 결제 방법 선택 안 한 경우 체크하는 유효성 검사 추가

for (var i=0; i<4; i++) {
  var input_price = document.getElementById("btExpVOList" + i + ".PRICE");
  var select_payment = document.getElementById("btExpVOList" + i + ".PAYMENT_METHOD");
  
  // 금액 비교를 위한 text -> int 형변환
  input_price.value = input_price.value.replace(/\D/g,'') * 1;

  // 금액 있는데 결제방법 선택 안한 경우 -> 리턴
  if(input_price.value>0 && select_payment.value==999) {
    // 다시 콤마 텍스트로 변환
    input_price.value = (input_price.value * 1).toLocaleString();
    alert("출장 비용 입력 시 결제방법을 반드시 선택해야 합니다.");
    return;
  }
  // 금액 없는데 결제방법 선택된 경우 -> 결제방법 초기화
  if(input_price.value==0 && select_payment.value!=999) {
    select_payment.value=999;
  }
  // 콤마 포함한 text -> 콤마 제거 후 int 형변환
  input_price.value = input_price.value.replace(/\D/g,'') * 1;
}

정보처리기사

요구사항 1, sql 1, 2

기타

프로그래머스 sql 고득점 키트를 전부 풀었다. 문제 대부분은 아주 쉬운 수준이었지만 가끔 어려운 것이 있었다.

간단한 SQL 함수, 팁

  • ISNULL(컬럼명, '대체값'): 컬럼의 값이 NULL이면 '대체값'을 넣어서 출력해준다.
  • 보통 컬럼명 Like '비교문자열' 이렇게 많이 썼는데 '비교대상 문자열' LIKE CONCAT('%', 컬럼명, '%')도 된다. 이름컬럼의 값이 '이름1, 이름2, 이름3, 이름4, 이름5' 중 하나인 것들을 찾는데 사용했다.
  • ORDER BY에 연산을 그대로 사용할 수 있었다. order by datediff(date1, date2) -> order by date1 - date2
  • DATETIME에서 DATE만 가져오기: date_format()함수를 생각했는데 left(10)으로 전체 date 중 앞 10자리인 yyyy-mm-dd만 가져오는 방법도 가능했다.

WITH RECURSIVE

WITH로 가상테이블 생성

WITH 가상테이블명 AS (
	SELECT 초기값 AS 컬럼명
    UNION ALL
    SELECT 쿼리
)
SELECT * FROM 가상테이블명;

WITH를 이용해 가상테이블을 생성해서 사용할 수 있다.

WITH RECURSIVE로 자기 자신 참조하는 가상테이블 생성

WITH RECURSIVE 가상테이블명 AS (
	SELECT 초기값 AS 컬럼명1
    UNION ALL
    SELECT 컬럼명1 계산식 FROM 가상테이블명 WHERE 조건
)
-- 재귀로 임시 테이블 생성해서 사용하기
WITH RECURSIVE PRACTICE AS 
(
	SELECT 1 AS IDX
    UNION ALL
    SELECT IDX+1 FROM PRACTICE WHERE IDX<13
)
SELECT CONCAT(IDX, '의 아해') AS NAME FROM PRACTICE;
profile
문서화를 좋아하는 개발자

0개의 댓글