matlab

숫자를 통화 표기로 바꾸기

게으른 the lazy 2023. 8. 2. 23:35

 

매트랩 단톡방에서 재밌는 문제가 나왔습니다. 숫자에 통화 표기처럼 세 자리마다 쉼표를 추가하는 것인데요. 다양한 방법들이 나왔는데, 저는 매트랩스러운 방법을 생각해보았습니다. 우선 쉼표가 추가된 이상 숫자는 분명히 아니니 char 배열로시작하도록 하죠.

 

>> J = '1234567890';

 

제 아이디어는 아래와 같습니다.

1. 길이가 3의 배수가 되도록 왼쪽에 zero padding을 한다. (뒤에서 보겠지만 0이 아니어도 무관합니다.)

2. 세 자리씩 끊어지도록 reshape을 한다. (역시 매트랩은 reshape이죠.)

3. 세 자리마다 뒤에 쉼표를 추가한다.

4. 한 줄로 다시 이어붙인다.

5. 맨 뒤 쉼표를 없애고, padded zero도 없앤다.

 


 

1. 길이가 3의 배수가 되도록 왼쪽에 0을 붙입니다. pad 함수를 이용합니다.

>> J = pad(J, ceil(length(J)/3)*3, 'left', '0')
J =
    '001234567890'

 

 

 

2. 세 자리씩 끊어지도록 reshape을 합니다. 나중에 다시 합칠 것을 감안하여 transpose는 하지 않도록 하죠.

>> J = reshape(J, 3, [])
J =
  3×4 char array
    '0258'
    '0369'
    '1470'

 

3. 이제 밑에다 쉼표로 된 배열을 붙입니다.

>> J = [J; repmat(',', 1, size(J, 2))]
J =
  4×4 char array
    '0258'
    '0369'
    '1470'
    ',,,,'

 

4. 원래대로 한줄로 이어붙이고,

>> J = J(:)'
J =
    '001,234,567,890,'

 

5. 마지막 쉼표와 leading zeros를 없애줍니다. 0을 없애는 것은 strip 함수를 사용합니다.

>> J(end) = []
J =
    '001,234,567,890'
>> J = strip(J, "left", '0')
J =
    '1,234,567,890'

 


 

모두 합쳐서 함수로 만들면 편하겠군요. 숫자가 들어와도 동작하도록 num2str을 추가합니다.

 

function J = num2currency(J)

J = num2str(J);
J = pad(J, ceil(length(J)/3)*3, 'left', '0');
J = reshape(J, 3, []);
J = [J; repmat(',', 1, size(J, 2))];
J = J(:)';
J(end) = [];
J = strip(J, "left", '0');

end
>> num2currency(78912347891234)
ans =
    '78,912,347,891,234'

 

물론 숫자가 너무 크면 부동소수점에 의해 제대로 동작하지 않을 수 있습니다.

>> num2currency(123478912347891234)
ans =
    '1.2,347,891,234,789,12e,+17'

 

이럴 때에는 입력을 문자열로 하는게 좋겠군요.

>> num2currency('123478912347891234')
ans =
    '123,478,912,347,891,234'

애초에 저만한 돈을 쓸 일이 있을까 싶기는 하지만 또모르죠.

 

- 게으른