验证powershell中的十进制格式

时间:2017-09-13 14:55:10

标签: powershell powershell-v2.0

我在平面文件中有一个小数值,我想验证小数值是decimal(18,2)

我已经将文件内容存储在变量中,并且可以回显该列。

我的代码是:

$EntryList=Import-Csv -Delimiter "|" -Header @(
      "RECORD_TYPE", 
      "COD_FIN_INSTRUMENT_ATTRIBUTE",
      "COD_SEGM_REG",
        "IMP_CCF_RWA") -Path $datarecordnum

1 个答案:

答案 0 :(得分:3)

我假设您要表示要验证给定的数字是否可以由SQL Server的DECIMAL(18,2)格式表示。

我会尝试将值转换为C#的SqlDecimal数据类型,该类型旨在表示SQL Server的DECIMAL数据类型。然后尝试将值强制为给定的比例和精度,并验证该值是否与原始值匹配。

这是一个示例函数:

function Test-DecimalFormat {
    param(
        [Parameter(Mandatory = $true, Position = 0)]
         $Value,
        [Parameter(Mandatory = $true, Position = 1)]
        [int]
        $Precision,
        [Parameter(Mandatory = $true, Position = 2)]
        [int]
        $Scale
    )

    try {
        $DecimalValue = [System.Convert]::ToDecimal($Value);
        $SqlDecimalValue = [System.Data.SqlTypes.SqlDecimal]::new($DecimalValue);
        return ([System.Data.SqlTypes.SqlDecimal]::ConvertToPrecScale($SqlDecimalValue, $Precision, $Scale).Value -eq $DecimalValue);
    }
    catch {
        return $false;
    }
}

示例:

PS C:\> Test-DecimalFormat -Value 123456789123456789.78 -Precision 18 -Scale 2
False
PS C:\> Test-DecimalFormat -Value 789.78 -Precision 18 -Scale 2
True
PS C:\> Test-DecimalFormat -Value 789.78901 -Precision 18 -Scale 2
False
PS C:\> Test-DecimalFormat -Value ([decimal]::MaxValue) -Precision 18 -Scale 2
False
PS C:\> Test-DecimalFormat -Value ([decimal]::MaxValue) -Precision 38 -Scale 0
True

请注意,此函数不适用于非常大的精度,因为NUMERIC() SQL数据类型的最大值为10 ^ 38 - 1,而System.Decimal的最大值为2 ^ 96。如果您需要System.Decimal范围之外的精确值,则可能需要比较值的二进制表示。有关详情,请参阅this answer