我在平面文件中有一个十进制值,我想验证十进制值是否decimal(18,2)
。
我已经将文件内容存储在变量中,并且可以回显列。
我的代码是:
$EntryList=Import-Csv -Delimiter "|" -Header @(
"RECORD_TYPE",
"COD_FIN_INSTRUMENT_ATTRIBUTE",
"COD_SEGM_REG",
"IMP_CCF_RWA") -Path $datarecordnum
我假设你的意思是你想验证一个给定的数字可以用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
范围的精确值,则可能必须比较值的二进制表示。 请参阅此答案了解更多信息。