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'
애초에 저만한 돈을 쓸 일이 있을까 싶기는 하지만 또모르죠.
- 게으른