Swift4中如何按含单位的文件大小对缓存目录文件升序排序?
解决带单位文件大小的正确排序问题
这个问题太常见了——直接按字符串里的数字排序肯定会踩坑,毕竟250看起来比2大,但2MB的实际大小可是远超过250KB的!核心解决思路就是先把所有带单位的大小统一转换成同一个基准单位(比如字节),基于真实的数值排序,就不会出错了。
下面给你具体的实现步骤和示例代码(以Python为例,其他语言思路完全一致):
步骤拆解
- 解析字符串:从每个带单位的大小字符串里拆分出数字和单位(比如从"2 MB"里拿到
2和MB) - 建立单位映射:定义不同单位到字节的换算关系(注意是二进制1024进制还是十进制1000进制,根据你的需求选)
- 统一转换:把每个大小都转换成字节数
- 排序输出:基于转换后的字节数升序排序,必要的话再转回带单位的格式
代码示例
假设你有一个存储文件大小的列表:
file_sizes = ["2 MB", "250 KB", "1.5 GB", "512 Bytes"]
首先写一个转换函数,把带单位的字符串转成字节数:
def convert_to_bytes(size_str): # 拆分数字和单位部分 num_part, unit_part = size_str.split() # 处理数字(支持小数) size_num = float(num_part) # 统一单位大小写,避免大小写问题 unit = unit_part.strip().upper() # 二进制换算(1024进制,符合多数文件系统的计算方式) unit_conversion = { "BYTES": 1, "KB": 1024, "MB": 1024 ** 2, "GB": 1024 ** 3, "TB": 1024 ** 4 } # 如果是十进制换算(比如部分存储厂商用1000进制),把上面的1024改成1000即可 # unit_conversion = { # "BYTES": 1, # "KB": 1000, # "MB": 1000 ** 2, # "GB": 1000 ** 3, # "TB": 1000 ** 4 # } if unit not in unit_conversion: raise ValueError(f"不支持的单位:{unit}") return size_num * unit_conversion[unit]
然后用这个函数作为排序的key,进行升序排序:
# 按真实字节数升序排序 sorted_file_sizes = sorted(file_sizes, key=lambda x: convert_to_bytes(x)) print(sorted_file_sizes) # 输出结果:['512 Bytes', '250 KB', '2 MB', '1.5 GB']
额外提示
- 如果你是直接从系统读取文件大小,建议直接获取字节数(比如Python的
os.path.getsize()方法),这样完全不用处理单位转换,排序更准确高效 - 注意处理异常情况:比如格式错误的大小字符串、不支持的单位等,避免程序崩溃
内容的提问来源于stack exchange,提问作者Pratz_iOS
相关产品推荐
相关产品推荐

