chishingchan 发表于 2020-6-17 20:15:36

【已解决】如何按数字给字符串变量两端加上空格

本帖最后由 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


afan 发表于 2020-6-17 20:35:00

这个量级需要什么算法,直接加空格组合就是…
如果只有5位,两边不等分呢?一边加3,一边加4?

chishingchan 发表于 2020-6-17 20:39:54

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我是这样处理的,但只是返回空格的数字!

chishingchan 发表于 2020-6-17 20:44:33

afan 发表于 2020-6-17 20:35
这个量级需要什么算法,直接加空格组合就是…
如果只有5位,两边不等分呢?一边加3,一边加4?


afan 发表于 2020-6-17 20:48:11

chishingchan 发表于 2020-6-17 20:44


你是为了等宽字体占位的显示效果?

chishingchan 发表于 2020-6-17 20:54:55

afan 发表于 2020-6-17 20:48
你是为了等宽字体占位的显示效果?

是的,有没有好办法?

chishingchan 发表于 2020-6-21 20:44:34

本帖最后由 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

chishingchan 发表于 2020-6-21 20:45:55

afan 发表于 2020-6-17 20:48
你是为了等宽字体占位的显示效果?

粗浅的弄了7#代码,a 大可以的话再帮忙精简优化一下,谢谢!

afan 发表于 2020-6-21 20:58:35

chishingchan 发表于 2020-6-21 20:45
粗浅的弄了7#代码,a 大可以的话再帮忙精简优化一下,谢谢!
你这还是我之前的方法,只不过加了字节长度判断。我还以为不是你需要的,挂了几天没动静,删了。

chishingchan 发表于 2020-6-21 21:09:32

afan 发表于 2020-6-21 20:58
你这还是我之前的方法,只不过加了字节长度判断。我还以为不是你需要的,挂了几天没动静,删了。

中文字符串与英文字符串还是有点“不对劲”,请帮忙修正。谢谢!

chishingchan 发表于 2020-6-22 11:26:09

afan 发表于 2020-6-17 20:48
你是为了等宽字体占位的显示效果?

1# 代码虽然冗长点,但是结果没出错。

afan 发表于 2020-6-22 12:33:27

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]
查看完整版本: 【已解决】如何按数字给字符串变量两端加上空格