본문 바로가기
CS/Go

go programming - byte array 숫자에 콤마를 붙이는 방법

by Warehaus 2023. 7. 23.


오늘은 go programming 연습삼아

아래의 예제 코드를 만들어 보았습니다.

 

string 이 아닌 byte array 에 숫자를 할당해 두고

1,000 단위로 콤마를 붙여주는 코드입니다.

 

 

반응형

 

package main

import "fmt"

func comma(s []byte) []byte {
    rByteArray := make([]byte, len(s)+len(s)/3)
    j := 0
    for i := 0; i < len(s); i++ {
        if i != 0 && i%3 == 0 {
            rByteArray[j] = ','
            j = j + 1
            rByteArray[j] = s[i]
            j = j + 1
            continue
        }

        rByteArray[j] = s[i]
        j = j + 1
    }
    return rByteArray
}
func main() {
    bArray := []byte{'1', '2', '3', '0', '0', '0'}
    fmt.Println(string(comma(bArray)))
}

 

첫번 째 위치인 index 0 에서는 콤마를 생략하고

그 다음부터 3으로 나눠지는 위치마다 콤마를 붙여 rByteArray 에 할당하였습니다.

 

rByteArray 사이즈의 경우, 원래 byte array 에 콤마를 붙여줘야 하기 때문에

예상되는 콤마 갯수( s의 길이에서 3을 나눈 수 )만큼 사이즈를 할당하여  새로운 byte array를 구성하였습니다.

 

이렇게 사이즈를 키워서 array를 만들지 않으면

중간에 끊기게 될 것입니다.

 

 

 

 

 


문제점

 

위에처럼 코드를 작성하면 문제가 있습니다.

바로 콤마가 왼쪽부터 붙는다는 것인데요.

 

아래 처럼 테스트를 해 보면 문제를 발견할 수 있습니다.

 

package main

import "fmt"

func comma(s []byte) []byte {
	rByteArray := make([]byte, len(s)+len(s)/3)
	j := 0
	for i := 0; i < len(s); i++ {
		if i != 0 && i%3 == 0 {
			rByteArray[j] = ','
			j = j + 1
			rByteArray[j] = s[i]
			j = j + 1
			continue
		}

		rByteArray[j] = s[i]
		j = j + 1
	}
	return rByteArray
}
func main() {
	bArray := []byte("12345671123123123")
	fmt.Println(string(comma(bArray)))
}

 

조금 더 긴 byte array 로 테스트를 해보면 다음과 같이 결과가 나옵니다.

 

 ./comma_nonrecur 
123,456,711,231,231,23

 

1000 단위로 콤마를 찍고싶었는데

왼쪽부터 찍다보니 결과가 기대하는 것과 다소 다릅니다.

 

아래처럼 for loop를 byte array 끝에서부터  시작할 수 있도록 바꾸면

기대하는 결과를 얻을 수 있습니다.

 

package main

import "fmt"

func comma(s []byte) []byte {
    rByteArray := make([]byte, len(s)+len(s)/3)
    j := len(s) + len(s)/3 - 1
    move := 0
    for i := len(s) - 1; i >= 0; i-- {
        if move != 0 && move%3 == 0 {
            rByteArray[j] = ','
            j = j - 1
            rByteArray[j] = s[i]
            j = j - 1
            move = move + 1
            continue
        }
        rByteArray[j] = s[i]
        j = j - 1
        move = move + 1
    }
    return rByteArray
}
func main() {
    bArray := []byte("12345671123123123")
    fmt.Println(string(comma(bArray)))
}

 

우측부터 이동하도록 for loop를 변경하였고

콤마를 붙이는 위치를 지정하기 위해 move 라는 integer 변수를 이용해서

원본 데이터 bArray 의 우측 끝부터 얼만큼 이동하였는지를 확인합니다.

 

 

 

 

wh.