79 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			79 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package utility
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								import (
							 | 
						|||
| 
								 | 
							
									"strings"
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									"github.com/shopspring/decimal"
							 | 
						|||
| 
								 | 
							
								)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								// DesensitizeGeneric 通用脱敏函数:
							 | 
						|||
| 
								 | 
							
								// startReserveCount: 从字符串开头保留的字符数
							 | 
						|||
| 
								 | 
							
								// endReserveCount: 从字符串末尾保留的字符数
							 | 
						|||
| 
								 | 
							
								// asteriskChar: 用于替换的字符 (例如 '*')
							 | 
						|||
| 
								 | 
							
								// 例如:DesensitizeGeneric("这是一个秘密信息", 2, 2, '*') -> 这**信息
							 | 
						|||
| 
								 | 
							
								func DesensitizeGeneric(text string, startReserveCount int, endReserveCount int, asteriskChar rune) string {
							 | 
						|||
| 
								 | 
							
									if text == "" {
							 | 
						|||
| 
								 | 
							
										return ""
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									runes := []rune(text)
							 | 
						|||
| 
								 | 
							
									length := len(runes)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									// 计算实际需要保留的总字符数
							 | 
						|||
| 
								 | 
							
									totalReservedLength := startReserveCount + endReserveCount
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									// 如果需要保留的字符数大于等于总长度,则不脱敏
							 | 
						|||
| 
								 | 
							
									if totalReservedLength >= length {
							 | 
						|||
| 
								 | 
							
										return text
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									// 确保保留位数不为负数
							 | 
						|||
| 
								 | 
							
									if startReserveCount < 0 {
							 | 
						|||
| 
								 | 
							
										startReserveCount = 0
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									if endReserveCount < 0 {
							 | 
						|||
| 
								 | 
							
										endReserveCount = 0
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									// 如果保留总长度为0,且字符串不为空,则全部脱敏
							 | 
						|||
| 
								 | 
							
									if totalReservedLength == 0 && length > 0 {
							 | 
						|||
| 
								 | 
							
										return strings.Repeat(string(asteriskChar), length)
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									// 确保保留的长度不超过总长度
							 | 
						|||
| 
								 | 
							
									if startReserveCount > length {
							 | 
						|||
| 
								 | 
							
										startReserveCount = length
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									if endReserveCount > length-startReserveCount {
							 | 
						|||
| 
								 | 
							
										endReserveCount = length - startReserveCount
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									// 构造脱敏字符串
							 | 
						|||
| 
								 | 
							
									var sb strings.Builder
							 | 
						|||
| 
								 | 
							
									// 写入前缀
							 | 
						|||
| 
								 | 
							
									if startReserveCount > 0 {
							 | 
						|||
| 
								 | 
							
										sb.WriteString(string(runes[0:startReserveCount]))
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									// 写入星号
							 | 
						|||
| 
								 | 
							
									asteriskCount := length - startReserveCount - endReserveCount
							 | 
						|||
| 
								 | 
							
									if asteriskCount > 0 {
							 | 
						|||
| 
								 | 
							
										sb.WriteString(strings.Repeat(string(asteriskChar), asteriskCount))
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									// 写入后缀
							 | 
						|||
| 
								 | 
							
									if endReserveCount > 0 && length-endReserveCount >= startReserveCount { // 确保后缀不与前缀重叠
							 | 
						|||
| 
								 | 
							
										sb.WriteString(string(runes[length-endReserveCount:]))
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									return sb.String()
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								func StringToDecimal(val string) decimal.Decimal {
							 | 
						|||
| 
								 | 
							
									cleanedNum := strings.TrimRight(val, "\x00")         // 去除空字符
							 | 
						|||
| 
								 | 
							
									cleanedNum = strings.TrimSpace(cleanedNum)           // 去除空格
							 | 
						|||
| 
								 | 
							
									cleanedNum = strings.ReplaceAll(cleanedNum, ",", "") // 去除逗号
							 | 
						|||
| 
								 | 
							
									d, err := decimal.NewFromString(cleanedNum)
							 | 
						|||
| 
								 | 
							
									if err != nil {
							 | 
						|||
| 
								 | 
							
										return decimal.Zero
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									return d
							 | 
						|||
| 
								 | 
							
								}
							 |