我在平面文件中有一个小数值,我想验证小数值是decimal(18,2)
。
我已经将文件内容存储在变量中,并且可以回显该列。
我的代码是:
$EntryList=Import-Csv -Delimiter "|" -Header @(
"RECORD_TYPE",
"COD_FIN_INSTRUMENT_ATTRIBUTE",
"COD_SEGM_REG",
"IMP_CCF_RWA") -Path $datarecordnum
答案 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。