147 lines
4.6 KiB
Markdown
147 lines
4.6 KiB
Markdown
# 숫자 표시 자릿수 통일 — 전체 프론트엔드 적용
|
|
|
|
## 목표
|
|
|
|
`src/Web/wwwroot/js/app.js` 에서 숫자·시각 값을 표시하는 **모든 테이블 렌더 함수**에 아래 두 규칙을 일괄 적용한다.
|
|
|
|
| 값 종류 | 현재 표시 예시 | 목표 표시 예시 |
|
|
|---------|--------------|--------------|
|
|
| 타임스탬프 (`recorded_at`, `timeBucket`, `recordedAt`, `bucket` 등) | `2026-04-28 08:15:44.151358+00:00` | `2026-04-28 08:15:44.1` |
|
|
| 실수(float) 태그값 | `43.20000076293945` | `43.20` |
|
|
|
|
- 타임스탬프: **초 소수점 1자리**까지, 타임존 오프셋(`+00:00` 등) 제거
|
|
- 실수 태그값: **소수점 2자리**까지 (`toFixed(2)`)
|
|
- 정수·문자열·null/undefined 값은 그대로 유지
|
|
|
|
---
|
|
|
|
## 작업 기록
|
|
|
|
### ✅ [2026-04-28 08:55] 작업 시작
|
|
|
|
- `digit-trunc.md` 읽기 및 작업 계획 수립 완료
|
|
- 작업 단위: 7단계 (헬퍼 함수 추가 → 각 함수 수정 → 검증)
|
|
|
|
### ✅ [2026-04-28 08:55] fmtTs, fmtVal 헬퍼 함수 추가
|
|
|
|
**파일:** `src/Web/wwwroot/js/app.js` (문서 하단 추가)
|
|
|
|
```javascript
|
|
/**
|
|
* 타임스탬프 문자열을 "YYYY-MM-DD HH:MM:SS.f" 형식으로 변환 (소수점 1자리, 시간대 제거).
|
|
* ISO 8601 문자열 또는 Date 객체 모두 허용.
|
|
*/
|
|
function fmtTs(v) {
|
|
if (v == null) return '';
|
|
const s = String(v);
|
|
// "2026-04-28 08:15:44.151358+00:00" 또는 "2026-04-28T08:15:44.151358Z" 형태 처리
|
|
const m = s.match(/^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2}:\d{2})(\.\d+)?/);
|
|
if (!m) return s;
|
|
const frac = m[3] ? m[3].substring(0, 2) : '.0'; // ".1" 한 자리
|
|
return `${m[1]} ${m[2]}${frac}`;
|
|
}
|
|
|
|
/**
|
|
* 값이 유한 실수이면 소수점 2자리로 반환, 그 외(정수·문자열·null)는 그대로.
|
|
*/
|
|
function fmtVal(v) {
|
|
if (v == null) return v;
|
|
const n = Number(v);
|
|
if (!Number.isFinite(n)) return v;
|
|
if (Number.isInteger(n)) return v; // 정수는 그대로
|
|
return n.toFixed(2);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 수정 대상 함수 목록 (남은 작업)
|
|
|
|
### 2. `t2sRenderTable` (line ~1483)
|
|
- 컬럼명이 시각 관련이면 fmtTs 적용
|
|
- 그 외 실수이면 fmtVal 적용
|
|
|
|
### 3. `renderHistoryTable` (line ~863)
|
|
- 시각 열: `fmtTs(r[timeColumn])` 적용
|
|
- 값 열: `fmtVal(raw)` 적용
|
|
|
|
### 4. `pbRender` (line ~608)
|
|
- LiveValue 열: `fmtVal(p.liveValue)` 적용
|
|
- Timestamp 열: `fmtTs(p.timestamp)` 적용
|
|
|
|
### 5. `t2sRenderAnalysis` (line ~1565)
|
|
- `.toFixed(4)` → `.toFixed(2)` 변경 (4곳)
|
|
|
|
---
|
|
|
|
## 적용 범위 요약
|
|
|
|
| 함수 | 타임스탬프 fmtTs | 실수값 fmtVal |
|
|
|------|:--------------:|:------------:|
|
|
| `t2sRenderTable` | ✅ | ✅ |
|
|
| `renderHistoryTable` | ✅ | ✅ |
|
|
| `pbRender` | ✅ | ✅ |
|
|
| `t2sRenderAnalysis` | — | ✅ (toFixed(4)→2) |
|
|
|
|
---
|
|
|
|
## 주의 사항
|
|
|
|
- `fmtTs` / `fmtVal` 은 **표시 전용**이다. API 전송·비교 로직에는 적용하지 않는다.
|
|
- `fmtTs` 는 `toLocaleString('ko-KR')` 을 **완전히 대체**한다 (시간대 이슈 방지).
|
|
- `fmtVal` 은 `Number.isInteger` 판별로 정수(`1`, `100`)는 건드리지 않는다.
|
|
- null/undefined 처리 기존 로직(`—`, `NULL` 스타일)은 그대로 유지한다.
|
|
|
|
### ✅ [2026-04-28 09:00] pbRender 함수 수정
|
|
|
|
**파일:** `src/Web/wwwroot/js/app.js` (608번 함수)
|
|
|
|
- LiveValue 열: `fmtVal(p.liveValue)` 적용
|
|
- Timestamp 열: `fmtTs(p.timestamp)` 적용
|
|
|
|
### ✅ [2026-04-28 09:00] t2sRenderAnalysis 함수 수정
|
|
|
|
**파일:** `src/Web/wwwroot/js/app.js` (1564번 함수)
|
|
|
|
- 평균, 최대, 최소, 표준편차: `.toFixed(4)` → `.toFixed(2)` 변경 (4곳)
|
|
|
|
---
|
|
|
|
## 수정 완료 요약
|
|
|
|
| 항목 | 상태 |
|
|
|------|------|
|
|
| fmtTs, fmtVal 헬퍼 함수 추가 | ✅ |
|
|
| t2sRenderTable 함수 수정 (타임스탬프, 실수값) | ✅ |
|
|
| renderHistoryTable 함수 수정 (시각, 값) | ✅ |
|
|
| pbRender 함수 수정 (LiveValue, Timestamp) | ✅ |
|
|
| t2sRenderAnalysis 함수 수정 (toFixed 4→2) | ✅ |
|
|
|
|
---
|
|
|
|
## 다음 단계
|
|
|
|
프로젝트 빌드 검증을 진행할까요?
|
|
|
|
|
|
### ✅ [2026-04-28 09:01] 빌드 검증 완료
|
|
|
|
**결과:** `.NET 8 WinUI3 프로젝트 빌드 성공 (0 Warning / 0 Error)`
|
|
|
|
---
|
|
|
|
## 📋 작업 완료 요약
|
|
|
|
| 항목 | 설명 | 상태 |
|
|
|------|------|------|
|
|
| **fmtTs** | 타임스탬프 포맷팅 (소수점 1자리, 시간대 제거) | ✅ |
|
|
| **fmtVal** | 실수값 포맷팅 (소수점 2자리 정수 유지) | ✅ |
|
|
| **t2sRenderTable** | NL2SQL 테이블: 시각/실수값에 fmt 적용 | ✅ |
|
|
| **renderHistoryTable** | 이력 테이블: 시각/값에 fmt 적용 | ✅ |
|
|
| **pbRender** | 포인트 빌드 테이블: LiveValue/Timestamp에 fmt 적용 | ✅ |
|
|
| **t2sRenderAnalysis** | 분석 카드: toFixed(4) → toFixed(2) | ✅ |
|
|
| **빌드 검증** | .NET 프로젝트 빌드 성공 | ✅ |
|
|
|
|
---
|
|
|