如何在PowerShell中将字符串转换为双精度?

如何在PowerShell中将字符串转换为双精度?,powershell,type-conversion,Powershell,Type Conversion,我在PowerShell中有一个脚本,用于从CSV导入数据。我收到一个错误 无法将值“日记账金额”转换为类型“System.Double”。错误:“输入字符串的格式不正确。” 位于C:\TestPowerShell\TestPowerShell1.ps1:98 char:1 +$JournalAmount=[double]$\.PSObject.Properties['Journal Amount'].Va。。。 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我在PowerShell中有一个脚本,用于从CSV导入数据。我收到一个错误


无法将值“日记账金额”转换为类型“System.Double”。错误:“输入字符串的格式不正确。” 位于C:\TestPowerShell\TestPowerShell1.ps1:98 char:1 +$JournalAmount=[double]$\.PSObject.Properties['Journal Amount'].Va。。。 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:InvalidArgument:(:)[],运行时异常 +FullyQualifiedErrorId:InvalidCastFromStringToDouble或Single


这是我的密码: 这解决了问题:

$JournalAmount = $JournalAmount -as [double]
$JournalAmount = $_.PSObject.Properties['Journal Amount'].Value

回答所问问题:

  • 将字符串强制转换为
    [double]
    -正如您自己尝试的那样,确实有效,但前提是该字符串被识别为(浮点)数字

    • 注意事项:由于PowerShell的强制转换是区域性不变的,因此只有
      被识别为小数点
      ,并且
      始终被解释为数千分组分隔符

    • 要敏感地分析区域性,请使用
      [double]::parse($string)
      根据当前区域性的规则进行分析(如
      $PSCulture
      中所反映);传递一个
      [cultureinfo]
      实例作为第二个参数,以根据给定区域性的规则进行解析(例如,要根据法国区域性的规则进行解析,请使用
      [double]::parse($string,[cultureinfo]'fr fr')

  • 如果无法识别字符串值,可以使用以下方法之一来处理该情况:

    • 使用处理错误;e、 例如,默认为
      0

      • [double]$double=尝试{$string}捕获{0}
    • 使用
      -as
      ,返回指定类型的实例,或者如果转换失败,
      $null

      • $double=$string-as[double];如果($null-eq$double){…}

至于你所尝试的

正如所指出的,问题的可能原因是CSV文件本身有一个标题行,但您也通过
-header
参数提供了标题

这将导致CSV文件的标题行被误读为第一个数据行,结果是,
Import CSV
返回的第一个对象包含列(标题)名称作为属性值-这将导致
[double]
转换失败,因为您正在有效地执行以下操作:
[double]“日记账金额”

因此:

  • 导入Csv
    调用中省略
    -Header
    参数

  • 作为优化,使用标准点表示法简化属性值检索;只需使用引号指定属性名称
    日记账金额
    ,因为它包含一个空格:


您的CSV文件是否在第一行已有标题?当您使用
导入Csv
指定
-Header$Header
时,它将所有行解释为数据(包括第一行),这将解释您在“日记账金额”列中获取值“日记账金额”)。您是否尝试将未转换的值写入控制台?在发生错误的行之前添加一行,如
Write Host$\.PSObject.Properties['Journal Amount'].Value
,这可能有助于您理解该值无法转换为Double@MatiasR.Jessen…是的,我的csv文件在第一行已经有一个头。我应该用什么来代替-Header$Header?请允许我给你给新来者的标准建议:如果你有答案,你将通过向未来的读者展示解决问题的方法来帮助他们。要接受答案,请单击大标题✓ 答案左侧大数字下方的符号(您将获得2点声誉积分)。如果你至少有15个声望点,你也可以投票给其他有用的答案(也可以选择被接受的答案)。如果你的问题还没有解决,提供反馈,或者,如果你自己找到了解决方案,我不认为这解决了问题,它只是隐藏了错误。如果
$JournalAmount
没有预先定义的值,则第一条语句是有效的no-op。第二条语句完全否定第一条语句的任何效果,只需将字符串值存储在
$JournalAmount
中。您可能正在考虑通过将“cast”放在变量名的左侧来约束变量的类型:
[double]$JournalAmount=$\u.PSObject.Properties['Journal Amount'].Value
;然而,这对你的情况没有帮助。
$JournalAmount = $JournalAmount -as [double]
$JournalAmount = $_.PSObject.Properties['Journal Amount'].Value
Import-CSV $FileBrowser.FileName | # !! No -Header argument
  ForEach-Object {
    # Simpler and more efficient than:
    #   $JournalAmount = [double] $_.PSObject.Properties['Journal Amount'].Value
    $JournalAmount = [double] $_.'Journal Amount'
  }
# ...