숫자 로케일 포맷

Number Formatting

숫자에 직접 쉼표·통화 기호를 끼워 넣지 말고 Intl.NumberFormat으로 로케일에 맞게 포맷하세요. ko-KR과 en-US 결과가 실시간으로 다릅니다.

다른 이름: Intl.NumberFormatLocale formatting
···
html
<div class="stage">
  <div class="pane bad"><span class="mark">✕</span><span class="label">Before</span>
    <p class="num" id="bt"></p>
    <p class="why" id="bw"></p></div>
  <div class="pane good"><span class="mark">✓</span><span class="label">After</span>
    <p class="num" id="gt1"></p>
    <p class="num sm" id="gt2"></p>
    <p class="why" id="gw"></p></div>
</div>
css
.stage{width:94%;height:88%;display:flex;gap:4%}
.pane{position:relative;flex:1;border-radius:14px;border:1px solid var(--line);background:var(--surface);padding:16px 14px 12px;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:6px}
.mark{position:absolute;top:10px;right:12px;font:800 16px/1 system-ui;color:var(--accent-2)}
.good .mark{color:var(--accent-3)}
.label{position:absolute;top:10px;left:12px;font:700 10px/1 monospace;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}
.num{margin:0;font:800 clamp(15px,4vmin,22px)/1.2 monospace;color:var(--fg)}
.num.sm{font-size:clamp(12px,3.2vmin,17px);color:var(--muted)}
.why{margin:6px 0 0;font:500 11px/1.3 -apple-system,sans-serif;color:var(--muted);text-align:center}
js
const bt = document.getElementById('bt'), bw = document.getElementById('bw');
const gt1 = document.getElementById('gt1'), gt2 = document.getElementById('gt2'), gw = document.getElementById('gw');
const koFmt = new Intl.NumberFormat('ko-KR', { style: 'currency', currency: 'KRW' });
const enFmt = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
function hardcoded(n) {
  return '$' + String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
const values = [1234567, 9800000, 45230];
let i = 0, lang = 'ko';
function paint() {
  const n = values[i % values.length];
  bt.textContent = hardcoded(n);
  gt1.textContent = koFmt.format(n);
  gt2.textContent = enFmt.format(n / 1000);
  bw.textContent = lang === 'ko' ? '통화 기호·자릿수가 항상 미국식으로 고정' : 'currency symbol and decimals fixed to US style';
  gw.textContent = lang === 'ko' ? 'Intl.NumberFormat이 로케일마다 자동 변환' : 'Intl.NumberFormat adapts per locale automatically';
}
paint();
setInterval(() => { i++; lang = lang === 'ko' ? 'en' : 'ko'; paint(); }, 2600);

숫자·통화·날짜의 표기 규칙은 로케일마다 다릅니다. 정규식으로 세 자리마다 쉼표를 끼워 넣는 코드는 영어권 숫자 표기만 가정한 것이고, 통화 기호를 문자열로 하드코딩하면 원화(₩, 소수점 없음)와 달러($, 소수점 둘째 자리)의 차이를 놓칩니다.

'Intl.NumberFormat(locale, options)'는 브라우저 내장 API로 이 문제를 정확히 해결합니다. 같은 숫자, 같은 코드라도 로케일 인자 하나만 바꾸면 그 나라의 관습대로 그룹 구분자·통화 기호·소수 자릿수가 자동으로 맞춰집니다.

데모는 직접 쉼표를 끼운 ✕와 'Intl.NumberFormat'을 쓴 ✓를 나란히 두고, 3초마다 숫자를 바꿔가며 실시간으로 다시 포맷합니다. ✓ 쪽은 ko-KR·en-US 두 결과를 동시에 보여줍니다.

언제 쓰나

금액·통계·큰 숫자를 화면에 표시할 때마다 문자열 조작 대신 Intl.NumberFormat을 기본값으로 쓰세요.