gpt4 book ai didi

powershell - 根据任意区域性设置将字符串转换为数字

转载 作者:行者123 更新时间:2023-12-03 14:28:33 34 4
gpt4 key购买 nike

我需要对基于文化格式化的文本文件中的数字进行一些数学运算,因此我可以得到 1,234.56 或者我认为可以得到 1.234,56 甚至 1 234,56。我原本想用现在的文化

$culture = (Get-Culture).Name

然后将所有数字转换为 en-US 格式,做我的数学运算,然后转换回原始格式。然而,像这样简单的事情是行不通的。
$useCulture = New-Object System.Globalization.CultureInfo("en-US")

$value1 = "1,234.56"
$value2 = "1234,56"

[double]$value1 = $value1.ToString("f", $useCulture)
[double]$value2 = $value2.ToString("f", $useCulture)

$value1
$value2

我希望两个值都返回 1234.56,但第二个值返回 123456,所以显然我不了解 ToString 是如何工作的。我的猜测是它假定它具有 en-US 格式,因为这是我的机器的配置,然后它试图转换为相同的东西,而在 $value2 上它只是假定千位分隔符在错误的地方?在任何情况下,我将如何从任意格式转换为指定格式,以便确定总和正确,然后转换回原始任意格式?
或者,我是否完全错过了某些东西,并且有更好的方法来解决这个问题?
另外,如果可能的话,我希望能够使用 PS 2.0 来执行此操作,因为我不能依赖于升级到更新版本的目标机器。

最佳答案

因此,如果总体结果是您想要只有数字且最多一位小数点的内容,我会尝试以下操作:

  • 用点替换任何非十进制
  • 去掉除最后一个点以外的所有点,我们将其视为小数点

  • 这是一个适用于一些测试用例的示例函数,但我在测试中绝对没有详尽无遗:
    function ConvertTo-Number {
    param(
    [Parameter(
    Mandatory=$true)]
    [System.String]
    $String
    )

    if($String -notmatch '\D'){
    return [int]$String
    } else {
    $ConvertedValue = ($String -replace '\D','.') -match '^(?<int>.*?)(?<dec>[\d]*)$'

    $ConvertedValue = $matches["int"] -replace '\D',''

    if($matches["dec"]){
    $ConvertedValue+=".$($matches["dec"])"
    }

    return [double]$ConvertedValue
    }
    }

    您可能希望首先/如果可能的话,例如清理输入字符串在其他任何事情之前删除空格。

    关于powershell - 根据任意区域性设置将字符串转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33616512/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com