김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 원격저장소
  • 로컬저장소
  • ㄱ
  • 깃허브데스크탑
  • GitHubDesktop
  • Remote저장소
  • local저장소
  • KMU_WINK

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[트러블슈팅] 타임리프에서 소수점 반올림 하는 방법
• 개발/Spring boot

[트러블슈팅] 타임리프에서 소수점 반올림 하는 방법

2023. 5. 20. 03:37

# 이슈 상황

  • 캡스톤 프로젝트를 진행하면서 사용자(시니어)가 식단을 등록하면 연계된 보호자에게 식단에 관한 내용을 메일링하는 서비스를 구현했다.
  • 배포 후 QA를 진행하던 중 double로 작성했던 값이 엄청 끝자리의 소수점까지 보여지는 경우가 생겼다. 아래 총 섭취 칼로리를 보게 되면 굳이 필요없는 부분까지 보여지게 된다.

  • 소수점 둘째자리까지 보여야 하기 때문에 이를 위한 트러블 슈팅이 필요했다.

# 해결

  • 두가지 부분을 수정하는 방법으로 해결했다. 

## 첫번째 방법

  • totalKcal을 계산하는 비즈니스 로직에서, 메일 템플릿(타임리프)에 뿌려줄때 이 값을 반올림 처리해서 보내줬다.
// double을 소수점 두째자리에서 반올림하게 하는 함수
  private double roundDouble(double num){
	return Math.round(num*100) / 100.0;
  }

비즈니스 로직 상에서 둘째자리까지 반올림하는 함수를 작성 후

context.setVariable("totalKcal", roundDouble(totalkcal));

위와 같이 반올림된 값 자체를 넘겨 줬다.

 

## 두번째 방법

  • 타임리프 상에서 소수점 둘째자리까지 표현하고 그 이하는 절개하는 방법을 사용했다.
  • 토탈칼로리는 어차피 서비스상에서 모든 값 들을 더해서 계산해주는 과정이 필요하기 때문에 로직으로 해결했지만, 끼니에서 들어오는 요소별 데이터는 DB에 있는 서비스단에서는 그냥 메일 템플릿에 넘겨주기만 하기 때문에 여기 별도의 코스트를 발생시키고 싶지 않았다.
<tr th:each=" foodinfo: ${meals}">
	<td align="center" th:text="${foodinfo.getName()}"><p style="font-size: 14px; line-height: 140%;"><strong>돈까쓰</strong></p></td>
	<td align="center" th:text="${foodinfo.getCarbohyborateTotal()}"><p style="font-size: 14px; line-height: 140%;"><strong>10</strong> g</p></td>
	<td align="center" th:text="${foodinfo.getFatTotal()}"><p style="font-size: 14px; line-height: 140%;"><strong>10</strong> g</p></td>
	<td align="center" th:text="${foodinfo.getProtein()}"><p style="font-size: 14px; line-height: 140%;"><strong>10</strong> g</p></td>
	<td align="center" th:text="${foodinfo.getCalorie()}"><p style="font-size: 14px; line-height: 140%;"><strong>100</strong> kcal</p></td>
</tr>
  • 위와 같은 기존 코드에서 아래와 같이 numbers.formatDecimal을 사용했다. 
<tr th:each=" foodinfo: ${meals}">
	<td align="center" th:text="${#numbers.formatDecimal(foodinfo.getCarbohyborateTotal(),1,2)}"><p style="font-size: 14px; line-height: 140%;"><strong>10</strong> g</p></td>
	<td align="center" th:text="${#numbers.formatDecimal(foodinfo.getFatTotal(),1,2)}"><p style="font-size: 14px; line-height: 140%;"><strong>10</strong> g</p></td>
	<td align="center" th:text="${#numbers.formatDecimal(foodinfo.getProtein(),1,2)}"><p style="font-size: 14px; line-height: 140%;"><strong>10</strong> g</p></td>
	<td align="center" th:text="${#numbers.formatDecimal(foodinfo.getCalorie(),1,2)}"><p style="font-size: 14px; line-height: 140%;"><strong>100</strong> kcal</p></td>
</tr>
  • 타임리프의 numbers.formatDecimal에는 위와 같은 경우 3가지 인자를 넣을 수 있다.
  • numbers.formatDecimal( 사용할 숫자, 정수부분을 최소 몇자리까지 표기할지, 소수분을 몇자리까지 표기할지 )  이다.
  • 나의 경우는 정수 부분은 0.12와 같이 최소 1자리는 표기되게 하고, 소수부분은 둘째자리까지 표기하고 싶기 때문에 위와같이 1과 2의 값을 넣어 주었다.
저작자표시 (새창열림)

'• 개발 > Spring boot' 카테고리의 다른 글

[SpringBoot] Amazon Linux 2 AMI JDK11 설치 및 타임존 설정하기  (0) 2023.08.08
[SpringBoot&트러블슈팅] ddl-auto를 validate로 변경했을때 missing table 에러 해결하기  (0) 2023.08.01
[SpringBoot&트러블슈팅] 연관관계 편의 메소드에서 @Builder를 사용할때 발생하는 NPE  (0) 2023.07.06
[트러블슈팅] Github Action으로 스프링부트 CI/CD 적용중 생기는 경로 이슈  (0) 2023.05.05
[Spring boot] 스프링부트 배포시 타임리프(Thymeleaf) 경로 에러  (0) 2023.02.17
    '• 개발/Spring boot' 카테고리의 다른 글
    • [SpringBoot&트러블슈팅] ddl-auto를 validate로 변경했을때 missing table 에러 해결하기
    • [SpringBoot&트러블슈팅] 연관관계 편의 메소드에서 @Builder를 사용할때 발생하는 NPE
    • [트러블슈팅] Github Action으로 스프링부트 CI/CD 적용중 생기는 경로 이슈
    • [Spring boot] 스프링부트 배포시 타임리프(Thymeleaf) 경로 에러
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바