【已解决】如何按数字给字符串变量两端加上空格
本帖最后由 chishingchan 于 2020-6-22 11:22 编辑例如:排版字符串是12个英文字符长度,如果$s字符串变量值(abcdef)的长度是6,需要将$s字符串变量值两端各加3个 空格,
有什么函数能搞定?谢谢!
粗浅代码
$S = "字符串Abc"
$C = 12 ;空间长度
$I = "M" ;左L 中M 右R 对齐
MsgBox(0, "处理结果: " & _BinaryLen(_AddSpace($S, $C, $I)), Chr(34) & _AddSpace($S, $C, $I) & Chr(34))
Func _AddSpace($String, $Length, $LMR)
$SLBL = _BinaryLen($String) ;中文字占用长度
$SLCN = StringLen($String) ;中文字计算长度
; $CN = $SLBL - $SLCN ;中文字数
Switch $LMR
Case "L" ;左对齐
$RS = $Length - $SLBL ;右侧空格数
$LS = 0
Return StringFormat('%-' & $SLCN + $RS & 's', $String)
Case "M" ;中对齐
$RS = Int(($Length - $SLBL)/2) ;右侧空格数
$LS = $Length - $SLBL - $RS ;左侧空格数
$L = StringFormat('%-' & $SLCN + $RS & 's', $String)
$R = StringFormat('%' & $SLCN + $LS + $RS & 's', $L)
Return $R
Case "R" ;右对齐
$LS = $Length - $SLBL ;左侧空格数
$RS = 0
Return StringFormat('%' & $SLCN + $LS & 's', $String)
EndSwitch
EndFunc
Func _BinaryLen($Expression)
$Len = StringLen(StringReplace(StringToBinary($Expression, 1), "0x", ""))/2
Return $Len
EndFunc
这个量级需要什么算法,直接加空格组合就是…
如果只有5位,两边不等分呢?一边加3,一边加4? afan 发表于 2020-6-17 20:35
这个量级需要什么算法,直接加空格组合就是…
如果只有5位,两边不等分呢?一边加3,一边加4?
Func _AddSpace($String, $Length)
$LS = Ceiling(($Length-_BinaryLen($String))/2);左侧空格数
$RS = Round(($Length-_BinaryLen($String))/2,0);右侧空格数
EndFunc
Func _BinaryLen($Expression)
$Len = StringLen(StringReplace(StringToBinary($Expression, 1), "0x", ""))/2
Return $Len
EndFunc我是这样处理的,但只是返回空格的数字! afan 发表于 2020-6-17 20:35
这个量级需要什么算法,直接加空格组合就是…
如果只有5位,两边不等分呢?一边加3,一边加4?
chishingchan 发表于 2020-6-17 20:44
你是为了等宽字体占位的显示效果? afan 发表于 2020-6-17 20:48
你是为了等宽字体占位的显示效果?
是的,有没有好办法? 本帖最后由 chishingchan 于 2020-6-22 11:23 编辑
$S = "字符串Abc"
$C = 12 ;空间长度
$I = "M" ;左L 中M 右R 对齐
MsgBox(0, "处理结果: " & _BinaryLen(_AddSpace($S, $C, $I)), Chr(34) & _AddSpace($S, $C, $I) & Chr(34))
Func _AddSpace($String, $Length, $LMR)
$SLBL = _BinaryLen($String) ;中文字占用长度
$SLCN = StringLen($String) ;中文字计算长度
; $CN = $SLBL - $SLCN ;中文字数
Switch $LMR
Case "L" ;左对齐
$RS = $Length - $SLBL ;右侧空格数
$LS = 0
Return StringFormat('%-' & $SLCN + $RS & 's', $String)
Case "M" ;中对齐
$RS = Int(($Length - $SLBL)/2) ;右侧空格数
$LS = $Length - $SLBL - $RS ;左侧空格数
$L = StringFormat('%-' & $SLCN + $RS & 's', $String)
$R = StringFormat('%' & $SLCN + $LS + $RS & 's', $L)
Return $R
Case "R" ;右对齐
$LS = $Length - $SLBL ;左侧空格数
$RS = 0
Return StringFormat('%' & $SLCN + $LS & 's', $String)
EndSwitch
EndFunc
Func _BinaryLen($Expression)
$Len = StringLen(StringReplace(StringToBinary($Expression, 1), "0x", ""))/2
Return $Len
EndFunc afan 发表于 2020-6-17 20:48
你是为了等宽字体占位的显示效果?
粗浅的弄了7#代码,a 大可以的话再帮忙精简优化一下,谢谢! chishingchan 发表于 2020-6-21 20:45
粗浅的弄了7#代码,a 大可以的话再帮忙精简优化一下,谢谢!
你这还是我之前的方法,只不过加了字节长度判断。我还以为不是你需要的,挂了几天没动静,删了。 afan 发表于 2020-6-21 20:58
你这还是我之前的方法,只不过加了字节长度判断。我还以为不是你需要的,挂了几天没动静,删了。
中文字符串与英文字符串还是有点“不对劲”,请帮忙修正。谢谢! afan 发表于 2020-6-17 20:48
你是为了等宽字体占位的显示效果?
1# 代码虽然冗长点,但是结果没出错。 MsgBox(0, '', "'" & _StringAddSpace('字符串Abc', 12, 'L') & "'" & @LF & _
"'" & _StringAddSpace('字符串Abc', 12) & "'" & @LF & _
"'" & _StringAddSpace('字符串Abc', 12, 'R') & "'")
Func _StringAddSpace($sString, $iLength, $sMode = '') ; 根据指定字节长度及对齐方式在字符串首尾添加空格
;~ ###(字符串, 字节长度, 对齐模式) ;L左对齐 ;R右对齐 ;其它居中
$sString = StringStripWS($sString, 3)
Local $iBinaryLen = BinaryLen(StringToBinary($sString))
Local $iSTRLen = StringLen($sString)
If $iBinaryLen >= $iLength Then Return $sString
Local $nAdd = $iLength - $iBinaryLen
If $sMode = 'L' Then Return StringFormat('%-' & $nAdd + $iSTRLen & 's', $sString)
If $sMode = 'R' Then Return StringFormat('%' & $nAdd + $iSTRLen & 's', $sString)
Return StringFormat('%-' & $nAdd + $iSTRLen & 's', StringFormat('%' & Int($nAdd / 2) + $iSTRLen & 's', $sString))
EndFunc ;==>_StringAddSpace
页:
[1]