전에 작성했던 [js] 숫자를 카운트 되는 것처럼 보여주기 에서 사용했던 코드인데 함수로 따로 뺐습니다.
Object 에 확장을 했습니다. javascript는 모든것이 객체입니다. 때문에 Object에 확장을 한 것인데.
이렇게 Object에 확장하면 위험할 수 있다는 얘기를 본 것 같은데 정확히 기억이 나지 않습니다.;;
Object.prototype.formatNumber = function() {
if(!/^[0-9.]{1,}$/.test(this)) return false;
n = this + '';
x = n.split('.');
x1 = x[0];
x2 = x.length > 1 ? '.' + x[1] : '';
var rgx = /(d+)(d{3})/;
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + ',' + '$2');
}
return x1 + x2;
};
var n = 12345.3333;
console.log(n.formatNumber());
console.log("132345".formatNumber());
역시 코드는 http://jsfiddle.net/rootbox/ZuEYR/ 이곳에서 보고 편집하고 실행해보실 수 있습니다.
통화 형태의 숫자로 바꿀 땐 정규식 한 줄로 간단하게 해결하는 법이 있더군요.
그리고 Object.prototype properties를 건드리면 Object가 prototype chains 최상위에 있어서 모든 객체가 해당 properties를 물려받게 되는데, 가령 특정 객체의 고유 properties를 알아보려고 for in 루프를 돌리면 의도치 않게 상속된 해당 properties가 노출되는 우려가 있습니다. 물론 이럴 때를 대비해서 보통 hasOwnProperty()로 걸러냅니다만.
결국, 제 3자의 코드와 섞였을 때 생길지도 모를 충돌과 혼선을 막으려고 전역 변수 선언을 최소화하려는 노력과 비슷한데, 모든 코드를 다 통제할 수 있는 상황이라면 큰 문제가 안 될 수도 있겠네요.
예전부터 feed 등록을 해뒀었는데 이제야 처음 댓글을 다네요. 🙂
앗! 댓글 링크 표시의 스타일이 막혀있군요.
혹시나 해서 정규식 관련 링크입니다.
http://appletree.or.kr/blog/notes/number-to-currency-regular-expressions/
아.. 임의로 선언한 프로퍼티가 노출될 수 있는 문제와 코드간 혼선의 문제가 있을 수 있다는 말씀이시죠? 일전에 문제가 될 수 있는 부분에 대해 본 것 같은데 정확히 기억이 나질 않아서요.. 감사합니다. 🙂
나름 정규식을 유용하게 쓰고 있다고 생각했는데.. 정규식만으로 해결하는 방법은 생각하지 못했네요.. 또 감사합니다. 😉
근데.. 닉이 익숙한데요?!