如何使用powershell将包含2个数字的字符串转换为货币?

I-S*_*lot 2 regex powershell replace

我的文本文件包含由"+"符号分隔的2个数字.试图找出如何用货币等价替换它们.
示例字符串:

20 + 2将转换为0.20美元+ 0.02美元

1379 + 121将是> $ 13.79 + $ 1.21 USD

400 + 20将是4.00美元+ 0.20美元

等等.

我尝试使用几个角度,但它们不起作用或提供奇怪的结果.我试图通过尝试找到我认为会出现的所有模式来做到这一点.

.\Replace-FileString.ps1 "100+10" '$1.00+$0.10' $path1\*.txt -Overwrite
.\Replace-FileString.ps1 "1000+100" '$10.00+$1.00' $path1\*.txt -Overwrite
.\Replace-FileString.ps1 "300+30" '$3.00+$0.30' $path1\*.txt -Overwrite
.\Replace-FileString.ps1 "400+20" '$4.00+$0.20' $path1\*.txt -Overwrite
Run Code Online (Sandbox Code Playgroud)

或者这只是不起作用.

Select-String -Path .\*txt -Pattern '[0-9][0-9]?[0-9]?[0-9]?[0-9]?\+[0-9][0-9]?[0-9]?[0-9]?[0-9]?' | ForEach-Object  {$_ -replace ", ", $"}  {$_ -replace "+", "+$"}
Run Code Online (Sandbox Code Playgroud)

Mat*_*sen 7

我试图通过尝试找到我认为会出现的所有模式来做到这一点

不要试试这个 - 我们是人类,我们不会想到所有边缘情况,即使我们这样做,我们需要编写(或生成)的代码量也是荒谬的.


我们需要一个更通用的解决方案,正则表达式可能确实对此有所帮助.

您描述的模式可以表示为三个不同的部分:

  1. 一个或多个连续数字
  2. 1加号(+)
  3. 一个或多个连续数字

考虑到这一点,让我们开始简化要使用的正则表达式模式:

\b\d+\+\d+\b
Run Code Online (Sandbox Code Playgroud)

或者,写着解释:

\b       # a word boundary
  \d+    # 1 or more digits
  \+     # 1 literal plus sign
  \d+    # 1 or more digits
\b       # a word boundary
Run Code Online (Sandbox Code Playgroud)

现在,为了将美分的绝对值转换为美元,我们需要捕获数字两侧的数字+,所以让我们添加捕获组:

\b(\d+)\+(\d+)\b
Run Code Online (Sandbox Code Playgroud)

现在,为了对捕获的组执行任何有趣的操作,我们可以使用该Regex.Replace()方法 - 它可以将scriptblock作为其替换参数:

$InputString  = '1000+10'
$RegexPattern = '\b(\d+)\+(\d+)\b'
$Substitution = {
    param($Match)

    $Results = foreach($Amount in $Match.Groups[1,2].Value){
        $Dollars = [Math]::Floor(($Amount / 100))
        $Cents   = $Amount % 100
        '${0:0}.{1:00}' -f $Dollars,$Cents
    }
    return $Results -join '+'
}
Run Code Online (Sandbox Code Playgroud)

在上面的scriptblock中,我们期望两个捕获组($Match.Groups[1,2]),计算美元和美分的数量,然后最终使用-f字符串格式运算符来确保美分值始终是两位数宽.

要进行替换,请调用以下Replace()方法:

[regex]::Replace($InputString,$RegexPattern,$Substitution)
Run Code Online (Sandbox Code Playgroud)

你去吧!

申请到一堆文件就像这样简单:

$RegexPattern = '\b(\d+)\+(\d+)\b'
$Substitution = {
    param($Match)

    $Results = foreach($Amount in $Match.Groups[1,2].Value){
        $Dollars = [Math]::Floor(($Amount / 100))
        $Cents   = $Amount % 100
        '${0:0}.{1:00}' -f $Dollars,$Cents
    }
    return $Results -join '+'
}

foreach($file in Get-ChildItem $path *.txt){
    $Lines = Get-Content $file.FullName
    $Lines |ForEach-Object {
        [regex]::Replace($_, $RegexPattern, $Substitution)
    } |Set-Content $file.FullName
}
Run Code Online (Sandbox Code Playgroud)