PHP number_format 으로 숫자 포맷팅 하기

PHP 에는 숫자를 편리하게 포맷팅할 수 있는 number_format이라는 내장 함수가 있습니다.


예로 아래와 같은 float 형식의 숫자가 있을 경우 number_format() 을 거치면 천 단위마다 , 를 찍어서 보기 좋게 만들어 줍니다.

<?php

$num = 12345678.2354;
echo number_format ($num);

// "12,345,678"


number_format() 은 기본적으로 소수점 이하를 날려 버리므로 소수점을 표시하려면 2번째 파라미터로 표시할 소수점 자릿수를 지정해야 합니다.


<?php

$num = 12345678.2354;
echo number_format ($num, 2);

// "12,345,678.24"


위 코드는 소수점 2자리만 표시하고 3자리부터는 반올림하므로 .24 가 표시됩니다.


만약 3자리만 표시하도록 지정한다면 4자리가 4 이므로 버려지게 됩니다.

<?php

$num = 12345678.2354;
echo number_format ($num, 3);

// "12,345,678.235"


하지만 세계 각 국마다 숫자를 표시하는 방법은 다르며 예로 프랑스는 천 단위 구분자로 , 가 아닌 공백을 사용하고 소수점은 , 로 표시합니다.


number_format의 3번째는 소숫점을 표시할 문자를 지정하고 4번째는 천 단위 구분자를 지정하므로 아래 코드는 프랑스 식으로 숫자를 포맷팅합니다.

프랑스식 숫자 표현
<?php

$num = 12345678.2354;
echo number_format ($num, 3, ',', ' ');

// "12 345 678,235"


또 독일은  천 단위와 소숫점의 구분자를 바꿔서 사용합니다. 즉 천 단위 구분자로 . 을, 소숫점 구분자로는 , 를 사용합니다.

독일식 숫자 표현
<?php

$num = 12345678.2354;
echo number_format ($num, 3, ',', '.');

// "12.345.678,235"


이런 모든 형식을 기억할 수는 없으므로 locale 설정과 관련없이 제대로 된 숫자 포맷팅을 하려면 표시하려는 국가의 locale 로 설정을 변경한 후에 해당 값을 사용하도록 수정하면 됩니다.

<?php

// 표시하려는 국가로 locale 변경
setlocale (LC_ALL, 'de_DE.UTF-8');

$locale = localeconv ();

echo number_format($number,
    $locale['decimal_point'],
    $locale['decimal_point'],
    $locale['thousands_sep']
);

PHP의 number_format 은 locale 설정을 사용하지 않는지 setlocale() 을 해 준후에 localeconv() 로 설정을 얻어온 후에 사용해야 합니다.

ubuntu 에서 setlocale 이 실패할 경우 locale-gen 명령어로 해당 locale 을 생성해 줘야 합니다.

sudo locale-gen fr_FR.UTF-8


Ref