github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/internal/pkg/service/fix.go (about) 1 package service 2 3 import ( 4 "fmt" 5 "regexp" 6 "strconv" 7 "strings" 8 9 "log" 10 11 consts "github.com/easysoft/zendata/internal/pkg/const" 12 "github.com/easysoft/zendata/internal/pkg/domain" 13 "github.com/easysoft/zendata/internal/pkg/helper" 14 commonUtils "github.com/easysoft/zendata/pkg/utils/common" 15 "github.com/easysoft/zendata/pkg/utils/vari" 16 "github.com/mattn/go-runewidth" 17 ) 18 19 type FixService struct { 20 } 21 22 func (s *FixService) AddFix(val interface{}, field *domain.DefField, count int, withFix bool) (ret interface{}) { 23 prefix := s.getStrValueFromFixRange(field.PrefixRange, count) 24 postfix := s.getStrValueFromFixRange(field.PostfixRange, count) 25 divider := field.Divider 26 length := field.Length 27 28 ret = val 29 30 if prefix == "" && postfix == "" && length == 0 && len(divider) == 0 { 31 return 32 } 33 34 if length > runewidth.StringWidth(fmt.Sprintf("%v", ret)) { 35 ret = helper.AddPad(fmt.Sprintf("%v", ret), *field) 36 } 37 38 if withFix && !vari.GlobalVars.Trim { 39 ret = prefix + fmt.Sprintf("%v", ret) + postfix 40 } 41 42 if vari.GlobalVars.OutputFormat == consts.FormatText && !vari.GlobalVars.Trim { 43 ret = fmt.Sprintf("%v", ret) + divider 44 } 45 46 if commonUtils.GetType(ret) == "string" { 47 //ret = s.TrimIfFormatIsNotText(fmt.Sprintf("%v", ret)) 48 } 49 50 return 51 } 52 53 func (s *FixService) getStrValueFromFixRange(rang *domain.Range, index int) string { 54 if rang == nil || len(rang.Values) == 0 { 55 return "" 56 } 57 58 idx := index % len(rang.Values) 59 x := rang.Values[idx] 60 61 return s.convPrefixVal2Str(x, "") 62 } 63 64 func (s *FixService) convPrefixVal2Str(val interface{}, format string) string { 65 str := consts.Na 66 success := false 67 68 switch val.(type) { 69 case int64: 70 if format != "" { 71 str, success = helper.FormatStr(format, val.(int64), 0) 72 } 73 if !success { 74 str = strconv.FormatInt(val.(int64), 10) 75 } 76 case float64: 77 precision := 0 78 if format != "" { 79 str, success = helper.FormatStr(format, val.(float64), precision) 80 } 81 if !success { 82 str = strconv.FormatFloat(val.(float64), 'f', precision, 64) 83 } 84 case byte: 85 str = string(val.(byte)) 86 if format != "" { 87 str, success = helper.FormatStr(format, str, 0) 88 } 89 if !success { 90 str = string(val.(byte)) 91 } 92 case string: 93 str = val.(string) 94 95 match, _ := regexp.MatchString("%[0-9]*d", format) 96 if match { 97 valInt, err := strconv.Atoi(str) 98 if err == nil { 99 str, success = helper.FormatStr(format, valInt, 0) 100 } 101 } else { 102 str, success = helper.FormatStr(format, str, 0) 103 } 104 default: 105 } 106 107 if str == consts.Na { 108 log.Println(str) 109 } 110 111 return str 112 } 113 114 func (s *FixService) TrimIfFormatIsNotText(str string) (ret string) { 115 ret = str 116 117 if vari.GlobalVars.OutputFormat != "" && vari.GlobalVars.OutputFormat != consts.FormatText { 118 ret = strings.TrimSpace(ret) 119 } 120 121 return 122 }