2017-09-13 88 views
-6

我在一個平面文件中有一個十進制值,我想驗證十進制值是decimal(18,2)在powershell中驗證十進制格式

我已經將文件內容存儲在變量中,並且可以回顯列。

我的代碼是:

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

你正在尋找這個十進制值在哪裏?你正在驗證格式或內容? – TheIncorrigible1

+0

我正在驗證格式 –

+0

您應該澄清您要查找的內容。沒有關於數據看起來像什麼或你想要什麼的線索。 – TheIncorrigible1

回答

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

+0

Test-DecimalFormat -Value'9999999999999999999999999999999999999999999999999999999999'-Precision 38 -Scale 0 bug .... – Esperento57

+0

@ Esperento57好的,固定的。 –