找回密码
 加入
搜索
查看: 186|回复: 3

文本排序,只能整数,如果是1.5,他就自动删除了。求教

[复制链接]
发表于 2026-6-11 15:55:03 | 显示全部楼层 |阅读模式
[测试]
672=13
723=3
246=3
872=3
782=3
873=3.5
783=3
635=2
319=2
604=1.5
675=1
212=1





#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <ScreenCapture.au3>


$car = IniReadSection("FFF.ini", "测试")
If @error = 1 Then
Else
        __ArraySort($car, 1, 1, 0, 1);降序
;~  _ArrayDisplay($car) ;显示出来
        IniDelete("FFF.ini", "测试")
        For $i = 1 To $car[0][0]
                IniWrite("FFF.ini", "测试", $car[$i][0], $car[$i][1])
        Next
EndIf


Func __ArraySort(ByRef $avArray, $iDescending = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0)
        If Not IsArray($avArray) Then Return SetError(1, 0, 0)
        Local $iUBound = UBound($avArray) - 1
        ; Bounds checking
        If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
        If $iStart < 0 Then $iStart = 0
        If $iStart > $iEnd Then Return SetError(2, 0, 0)
        Switch UBound($avArray, 0)
                Case 1
                        __ArrayQuickSort1D($avArray, $iStart, $iEnd)
                        If $iDescending Then
                                For $i = $iStart To $iEnd
                                        $avArray[$i] = StringFormat("%19d", $avArray[$i])
                                Next
                                _ArrayReverse($avArray, $iStart, $iEnd)
                                For $i = $iStart To $iEnd
                                        $avArray[$i] = StringFormat("%1d", $avArray[$i])
                                Next
                        EndIf
                Case 2
                        Local $iSubMax = UBound($avArray, 2) - 1
                        If $iSubItem > $iSubMax Then Return SetError(3, 0, 0)

                        If $iDescending Then
                                $iDescending = -1
                        Else
                                $iDescending = 1
                        EndIf

                        For $i = $iStart To $iEnd
                                $avArray[$i][$iSubMax] = StringFormat("%19d", $avArray[$i][$iSubMax])
                        Next
                        __ArrayQuickSort2D($avArray, $iDescending, $iStart, $iEnd, $iSubItem, $iSubMax)
                        For $i = $iStart To $iEnd
                                $avArray[$i][$iSubMax] = StringFormat("%1d", $avArray[$i][$iSubMax])
                        Next
                Case Else
                        Return SetError(4, 0, 0)
        EndSwitch

        Return 1
EndFunc   ;==>__ArraySort


   ;我想对这个INI  文件进行排序,他只对整数型有效。如果是带小数点的,他就不能排序了。

发表于 2026-6-11 17:05:45 | 显示全部楼层
先乘1000
#include <Array.au3>

$car = IniReadSection("FFF.ini", "测试")
If @error = 1 Then
Else
        For $i = 1 To $car[0][0]
                $car[$i][1] *= 1000
        Next
        _ArraySort($car, 1, 1, 0, 1)
        IniDelete("FFF.ini", "测试")
        For $i = 1 To $car[0][0]
                IniWrite("FFF.ini", "测试", $car[$i][0], $car[$i][1] / 1000)
        Next
EndIf

 楼主| 发表于 2026-6-11 17:31:28 | 显示全部楼层

非常感谢,一个思路,解决所有问题。。
发表于 2026-6-12 01:29:14 | 显示全部楼层
本帖最后由 gyp2000 于 2026-6-12 01:54 编辑

用官方带的排序函数是可以正常排序小数的。
$car = IniReadSection("FFF.ini", "测试")
If @error = 1 Then
Else
  _ArraySort($car, 1, 1, 0, 1);降序
  _ArrayDisplay($car) ;显示出来
EndIf


你写的排序函数中有使用格式化字符串命令,
StringFormat("%19d", $avArray[$i])
格式化后,输出的是文本。最终会按照文本方式排序,格式化命令还可能将小数转换成整数。

IniReadSection 读出的数组 内容都是文本,你想数字排序,需要将带小数的文本转换成浮点数。
如果不转换,将会按照文本方式排序。
修改后的代码如下。


$car = IniReadSection("FFF.ini", "测试")
If @error = 1 Then
Else
        For $s = 1 To UBound($car) - 1
                $car[$s][1] = Number($car[$s][1])
        Next
        _ArraySort($car, 1, 1, 0, 1, 0) ;降序
        _ArrayDisplay($car) ;显示出来
EndIf









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2026-7-10 16:43 , Processed in 0.060517 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表