使用ConvertFrom-String如何完整提取字符串中的小数?
解决PowerShell中ConvertFrom-String丢失小数精度的问题
当你用ConvertFrom-String处理带小数的混合字符串时,它的自动拆分逻辑会默认把数字解析成整数,导致小数部分被四舍五入。下面提供两种直接有效的解决方法:
方法一:用正则精准提取目标数值
如果你的字符串结构固定(比如有明确的键值对格式),用正则表达式可以精准提取完整的小数数值,再自定义输出结构:
[string]$aStringWithNumbers = 'Process started. Process completed with no errors. Time to complete = 4.249 = 100% CPU time = 43.859' # 提取"Time to complete"对应的小数 $timeComplete = [regex]::Match($aStringWithNumbers, 'Time to complete = (\d+\.\d+)').Groups[1].Value # 提取"CPU time"对应的小数 $cpuTime = [regex]::Match($aStringWithNumbers, 'CPU time = (\d+\.\d+)').Groups[1].Value # 生成结构化对象输出 [PSCustomObject]@{ 进程状态 = '无错误完成' 完成时间 = [double]$timeComplete CPU使用率 = '100%' CPU耗时 = [double]$cpuTime }
运行后会得到保留完整小数的结果:
进程状态 : 无错误完成 完成时间 : 4.249 CPU使用率 : 100% CPU耗时 : 43.859
方法二:给ConvertFrom-String指定模板
如果坚持要用ConvertFrom-String,可以通过模板明确指定字段的数值类型(比如double),让它正确识别小数:
[string]$aStringWithNumbers = 'Process started. Process completed with no errors. Time to complete = 4.249 = 100% CPU time = 43.859' # 定义与输入格式完全匹配的模板,指定数值字段为double类型 $template = @" Process started. Process completed with no errors. Time to complete = {TimeToComplete:double} = {CPUUsage} CPU time = {CPUTime:double} "@ $aStringWithNumbers | ConvertFrom-String -TemplateContent $template
输出结果会完整保留小数:
TimeToComplete : 4.249 CPUUsage : 100% CPUTime : 43.859
内容的提问来源于stack exchange,提问作者GallantChaos
相关产品推荐
相关产品推荐

