数値の書式
Go言語では、数値をカンマ区切りするのは、ローカライズで作れる。"golang.org/x/text/language"を参照
日本で数値を読む場合は、一,十,百,万のように4桁区切りが使われる。3桁カンマ区切りだと非常に読みづらい。
そこで、区切り位置,区切り文字を自由に設定できる関数を作ってみた。
FtoA関数
※注意: 指数表現(ex E03)には対応していない。
引数2(kind)のパターン (引数1 f64 = 1234567.890123 の場合)
0: 1,234,567.890 123 (ISOモデル 英, 日本など).
1: 1 234 567,890 123 (仏など).
2: 1.234.567,890 123 (独など).
3: 1'234'567,890 123 (スイスなど).
-1:  123'4567.8901 23 (今回の目的 4桁 区切り).
小数点以下の区切りが必要ない場合は、変数esを""にすれば良い。
import (
	"strconv"
	"strings"
)
func FtoA(f64 float64, kind int) string {
	var result string
	var wl int
	var sl int
	var ps string
	var ss string
	var es string
	switch kind {
	case 0: //[0] ISO,en,ja: 1,234,567.890
		sl = 3
		ps = "."
		ss = ","
		es = " "
	case 1: //[1] fr: 1 234 567,89
		sl = 3
		ps = ","
		ss = " "
		es = " "
	case 2: //[2] de: 1.234.567,89
		sl = 3
		ps = ","
		ss = "."
		es = " "
	case 3: //[3] ch: 1'234'567,89
		sl = 3
		ps = "."
		ss = "'"
		es = " "
	case -1: //[-1] ja4: 123'4567.890
		sl = 4
		ps = "."
		ss = "'"
		es = " "
	}
	w := strconv.FormatFloat(f64, 'f', -1, 64)
	sign := false
	if w[:1] == "-" {
		sign = true
		wl = len(w)
		w = w[1:wl]
	}
	wl = len(w)
	point := strings.Index(w, ".")
	if point < 0 {
		point = len(w)
	}
	ww := strings.Split(w, "")
	for i := range ww {
		if i < point {
			result = result + ww[i]
			j := point - i - 1
			if (j%sl == 0) && (j > 0) {
				result = result + ss
			}
		} else if i == point {
			result = result + ps
		} else {
			result = result + ww[i]
			j := i - point
			if (j%sl == 0) && (i+1 < wl) {
				result = result + es
			}
		}
	}
	if sign {
		result = "-" + result
	}
	return result
}
整数型(int,int8 ... int64)の場合は、float64(int)で変換する
  i64 := int64(123456789)
  num := FtoA(float64(i64), -1)
  fmt.Println(num)
出力結果は 1'2345'6789 となる。
日本語の読みは、1億 2千 3百 4十 5万 6千 7百 8十 9とかになる。
読む時に 1億2千万円 とか、下の桁を省略しやすくなる。
AtoF関数
FtoA関数の逆も欲しい。
※注意: 指数表現(ex E00)には対応していない。
func AtoF(s string, kind int) float64 {
	var result float64
	var w string
	var ww []string
	var ps string
	switch kind {
	case 0: //[0] ISO,en,ja: 1,234,567.890
		ps = "."
	case 1: //[1] fr: 1 234 567,89
		ps = ","
	case 2: //[2] de: 1.234.567,89
		ps = ","
	case 3: //[3] ch: 1'234'567,89
		ps = "."
	case -1: //[-1] ja4: 123'4567.890
		ps = "."
	}
	ww = strings.Split(s, "")
	if ww[0] == "-" {
		w = ww[0]
	}
	for i := range ww {
		switch ww[i] {
		case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9":
			w = w + ww[i]
		case ps:
			w = w + "."
		}
	}
	result, _ = strconv.ParseFloat(w, 64)
	return result
}
この AtoF関数は、単位などが含まれていてもOK!
  s := "123,456.789(kg)"
  f64 := AtoF(s, 0)
  fmt.Println(f64)
出力結果は 123456.789 となる。